作者:Adam Johnson
翻译:老齐
robots.txt
是与爬虫机器人相关的文件,例如谷歌的Googlebot,就是一个爬虫,在根URL中放一个文件/robots.txt
,例如htttps://example.com/robots.txt
,爬虫机器人就会把你的网页内容收录到搜索引擎中。
在Django项目中,可以通过一些简单操作,添加上robots.txt
文件。
你可以在应用之外的web服务器上提供robots.txt
,比如nginx。这种方法的缺点是,如果将应用程序转移到另一个web服务器,则需要重新进行配置。此外,你可能在Git中跟踪程序代码,而不是web服务器配置,并且最好跟踪对robots规则的更改。
我推荐的一个方法是通过Django项目中规范的URL来实现,它相当于一个视图。
这是一个很简单的方法,就是把robots.txt
文件作为模板,然后很简单地用URL来实现。
首先,在根模板目录中创建一个名为robots.txt
的文件,相当于创建一个新模板,例如,你的一个应用core
的模板结构是:
User-Agent: *
Disallow: /private/
Disallow: /junk/
然后,配置URL项:
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"),
),
]
这样就创建了一个路由,注意,没有从views.py
中引入。这并不是最好的想法,因为它将不同的层混合在一个文件中,但这样做的确不需要在视图文件中增加任何代码。
注意,需要将content_type
的值设置为text/plain
,而不是默认的text/html
,这样才能保证返回并打开那个文本文件。
上面的操作完成之后,就可以执行python manage.py runserver
,然后访问http://localhost:8000/robots.txt
。
这个方法更灵活,在视图函数中,能够自定义逻辑流程,比如检查Host
的头或者每个域的不同内容,也就是说你不用担心模板中渲染的HTML了。
首先,在应用中(比如前面说的core
应用)创建一个视图函数。
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")
这里我们使用的Django的装饰器require_GET
,意思是只有通过GET方式才能访问,写成基于类的视图也可以,但是这里用基于函数的视图进行演示。
在上面的视图函数中,就生成了robots.txt
的内容,最后将所有字符串用str.join()
连接起来。
然后,增加如下的URL项:
from django.urls import path
from core.views import robots_txt
urlpatterns = [
# ...
path("robots.txt", robots_txt),
]
你可以再次测试效果了。
按照上面的写法,我们可以写一个单元测试。
在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
执行上面的测试代码。
当然,如果你想在数据库中对robots.txt
的规则进行控制,比较简单的一个方法是使用第三方插件django-robots(地址:https://django-robots.readthedocs.io/en/latest/),我没有使用过它,但看起来很厉害。
希望以上这些对你有用。
原文链接:https://adamj.eu/tech/2020/02/10/robots-txt/