Django'da TXT dosyası servis etmek

2021-08-07 2 dk

Başta robots.txt dosyaları olmak üzere, alan adı doğrulama veya kimlik tanımlama için kullanılan çeşitli TXT dosyaları bulunmakta. Günün birinde bu TXT dosyalarını Django ile kök dizine dinamik olarak eklemeniz gerekebilir. Nasıl yapabileceğimizi görelim.

robots.txt: Web tarama robotlarının bir sitede hangi dizinlere erişebileceğini belirten metin dosyasıdır.

1. HttpResponse ile urlconf içinde

Çok basit ve anlaşılır. String olarak tanımlanan içerik, belirli URL'e erişilince text/plain içerik tipiyle servis edilir:

main/urls.py
from django.urls import path
from django.http import HttpResponse

ADS_TXT = 'Publisher ID: e98a0dce21'
ROBOTS_TXT_LINES = [
  'User-agent: Googlebot',
  'Disallow: /nogooglebot/',
  '\n'
  'User-agent: *',
  'Allow: /',
]
ROBOTS_TXT = '\n'.join(ROBOTS_TXT_LINES)

urlpatterns = [
  path('ads.txt', lambda r: HttpResponse(ADS_TXT, content_type="text/plain")),
  path('robots.txt', lambda r: HttpResponse(ROBOTS_TXT, content_type="text/plain")),
]

2. Template olarak

Bu yöntemde templates dizininizde örneğin robots.txt isminde dosyanızı oluşturacak ve bunu servis edeceksiniz.

templates/robots.txt
User-agent: Googlebot
Disallow: /nogooglebot/

User-agent: *
Allow: /
main/urls.py
from django.urls import path
from django.views.generic.base import TemplateView


urlpatterns = [
  path(
    'robots.txt',
    TemplateView.as_view(template_name="robots.txt", content_type="text/plain")),
]

3. Özel view fonksiyonu ile

Bu yöntemde function veya class-based view'ları kullanabiliriz.

main/views.py
from django.http import HttpResponse
from django.views.decorators.http import require_GET


@require_GET  # sadece GET isteklerini kabul et
def ads_txt(request):
    content = 'Publisher ID: e98a0dce21'
    return HttpResponse(content, content_type="text/plain")
main/urls.py
from django.urls import path
from main.views import ads_txt


urlpatterns = [
  path('robots.txt', ads_txt),
]

4. NGINX ile

Aslına bakarsak, statik bir dosyayı NGINX ile servis etmemiz gerektiği için bu yöntemi tercih etmek daha doğru olabilir. Fakat takdir edersiniz ki bu yöntemlerin her birinin avantajları ve dezavantajları var. Örneğin diğer yollarda test yazabilecek iken, bunda Django içinde test yazmanız pek mümkün değil. Yazar mısınız o ayrı.

NGINX konfigürasyonunuza yalnızca bir lokasyon satırı (location /robots.txt ...) eklemeniz yeterli:

upstream server_http {
    server backend:8000;
}

server {
    listen 80;
    # ...

    location / {
        proxy_pass http://server_http;
        # ...
    }

    location  /robots.txt {
      alias  /static/robots.txt;
    }

    # ...
}
Tarih: 2021-08-07
Kategoriler: geliştirmepython
Etiketler: django