Ana içeriğe geç

Django ile Favicon Dosyası Sunmak

Favicon dosyasına hepimiz aşinayız. Tarayıcı sekmesinde bir web sayfasının ikonu olarak kendini göstermekte ve arama motorları tarafından indexlenmekte. Ancak burada bir problem karşımıza çıktı ki CDN ile favicon dosyasını sunmak arama motorlarında favicon dosyasının görünmemesine sebep oldu. Bunun nedeni favicon adresinin CDN kullanımından dolayı sürekli değişmesi. Bu yazıda statik bir adreste favicon dosyasının nasıl sunulacağına değineceğim.

Sürüme Bağlı Statik Dosyalar

Eğer üzerinde çalıştığınız projede her sürümde STATIC_ROOT ve STATIC_URL değişiyorsa bu yazıyı okumaya devam edebilirsiniz. Problemin temeli uygulamanın her sürümünde favicon adresinin /static/UYGULAMA-SURUMU/favicon.png şeklinde olmasından kaynaklanıyor. Durum böyle olunca Google arama sonucunda favicon dosyasını göstermeyebiliyor. Çözümü favicon dosyasını statik bir adreste sunmak. Bunun için urls.py ve views.py içerisinde ufak değişiklikler yapmak gerekli.

Statik Olarak Favicon Sunmak

Uygulamanızın urls.py içerisine aşağıdaki satırı ekleyin.

from .views import serve_favicon


urlpatterns = [
    # ...
    path("favicon.png", serve_favicon, name="serve_favicon"),
]

views.py içerisine favicon dosyasını okuyup sunacak satırları ekleyin.

import os

from django.http import Http404
from django.http.response import FileResponse

from my_project.settings import STATIC_ROOT


def serve_favicon(request):
    favicon_file = os.path.join(STATIC_ROOT, "img/favicon.png")

    try:
        return FileResponse(open(favicon_file, "rb"))
    except IOError:
        raise Http404

Devamında favicon dosyasını içeren HTML satırlarını direkt olarak /favicon.png kullanacak şekilde değiştirin. Bu genelde base.html içerisinde yer almakta. Burada static("img/favicon.png") kullanmadığımıza dikkatinizi çekmek isterim. Dosya adresinin statik olarak /favicon.png olması gerekmekte.

Sonuç

Sadece tek bir dosya için CDN nimetlerinden faydalanamadığımızın farkındayım ancak sürüme bağlı statik dosya adreslerinin değiştiği durumda bunun başka bir çözümü yok. Tek bir dosyayı okuyup sunmak da o kadar performans problemine neden olmayacaktır.

Umarım bu yazı sizlere faydalı olmuştur.