Статьи о Джанго

Как добавить robots.txt на свой сайт Django

robots.txt - это стандартный файл для связи со сканерами-роботами, такими как Googlebot, которые не должны сканировать страницы. Вы размещаете его на своем сайте по корневому URL /robots.txt, например https://example.com/robots.txt.

Чтобы добавить такой файл в приложение Django, у вас есть несколько вариантов.

Вы можете обслуживать его с помощью веб-сервера без использования вашего приложения, такого как nginx. Недостатком этого подхода является то, что если вы перенесете свое приложение на другой веб-сервер, вам придется переделать эту конфигурацию. Также вы можете отслеживать код своего приложения в Git, но не конфигурацию вашего веб-сервера, и лучше всего отслеживать изменения в правилах ваших роботов.

Подход, который я одобряю, заключается в том, чтобы использовать его как обычный URL из Django. Это становится другим видом, который вы можете тестировать и обновлять с течением времени. Вот несколько подходов для этого.

С шаблоном

Это самый простой подход. Он сохраняет файл robots.txt в шаблоне и просто отображает его по URL-адресу.

Сначала добавьте новый шаблон robots.txt в корневой каталог шаблонов или в каталог шаблонов «основного» приложения:

User-Agent: *
Disallow: /private/
Disallow: /junk/

Во-вторых, добавьте запись urlconf:

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"),
    ),
]

Это создает новый вид непосредственно внутри URLconf, а не импортирует его из views.py. Это не лучшая идея, поскольку она смешивает слои в одном файле, но часто это делается прагматично, чтобы избежать лишних строк кода для простых представлений.

Нам нужно установить для content_type значение text/plain, чтобы он служил в качестве текстового документа, а не по умолчанию text/html.

После этого вы сможете запустить python manage.py runserver и увидеть файл, размещенный по адресу http://localhost: 8000/robots.txt (или аналогичный для вашего URL-адреса сервера запуска).

С пользовательским видом

Это немного более гибкий подход. Используя представление, вы можете добавить собственную логику, такую как проверка заголовка хоста и обслуживание различного контента для каждого домена. Это также означает, что вам не нужно беспокоиться о том, что в шаблоне экранированы HTML-переменные, которые могут оказаться неверными для текстового формата.

Сначала добавьте новый вид в ваше «основное» приложение:

from django.http import HttpResponse
from django.views.decorators.http import require_GET


@require_GET
def robots_txt(request):
    lines = [
        "User-Agent: *",
        "Disallow: /private/",
        "Disallow: /junk/",
    ]
    return HttpResponse("\n".join(lines), content_type="text/plain")

We’re using Django’s require_GET decorator to restrict to only GET requests. Class-based views already do this, but we need to think about it ourselves for function-based views.

Мы используем декоратор require_GET в Django, чтобы ограничивать только запросы GET. Представления на основе классов уже делают это, но нам нужно подумать об этом самим для представлений на основе функций.

Мы генерируем содержимое robots.txt внутри Python, комбинируя список строк с помощью str.join().

Во-вторых, добавьте запись urlconf:

from django.urls import path
from core.views import robots_txt

urlpatterns = [
    # ...
    path("robots.txt", robots_txt),
]

Опять же, вы должны быть в состоянии проверить это на runserver.

Тестирование

Как я писал выше, одним из преимуществ обслуживания этого из Django является то, что мы можем проверить это. Автоматические тесты защитят от случайного взлома кода или удаления URL.

Вы можете добавить некоторые базовые тесты в файл, например, core/tests/test_views.py:

from http import HTTPStatus

from django.test import TestCase


class RobotsTxtTests(TestCase):
    def test_get(self):
        response = self.client.get("/robots.txt")

        self.assertEqual(response.status_code, HTTPStatus.OK)
        self.assertEqual(response["content-type"], "text/plain")
        lines = response.content.decode().splitlines()
        self.assertEqual(lines[0], "User-Agent: *")

    def test_post_disallowed(self):
        response = self.client.post("/robots.txt")

        self.assertEqual(HTTPStatus.METHOD_NOT_ALLOWED, response.status_code)

Запустите тесты с помощью python manage.py test core.tests.test_views. Это также хорошая идея проверить, что они запускаются, заставляя их терпеть неудачу, например, закомментировав запись в URL conf.

Django-Robots

If you want to control your robots.txt rules in your database, there’s a Jazzband package called django-robots. I haven’t used it, but it seems well maintained. It also adds some less standard rules, like directing to the sitemap.

Если вы хотите контролировать свои правила robots.txt в своей базе данных, есть пакет от Jazzband под названием django-robots. Я не использовал его, но, кажется, в хорошем состоянии. Он также добавляет некоторые менее стандартные правила, такие как перенаправление на карту сайта.

Итог

Не забывайте проверять файл robots.txt через соответствующие инструменты в интернет.

https://adamj.eu/tech/2020/02/10/robots-txt/

Поделитесь с другими: