前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >​如何在Django项目中增加robots.txt

​如何在Django项目中增加robots.txt

作者头像
老齐
发布2020-06-16 18:26:49
1.2K0
发布2020-06-16 18:26:49
举报
文章被收录于专栏:老齐教室

作者: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的模板结构是:

代码语言:javascript
复制
User-Agent: *
Disallow: /private/
Disallow: /junk/

然后,配置URL项:

代码语言:javascript
复制
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应用)创建一个视图函数。

代码语言:javascript
复制
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项:

代码语言:javascript
复制
from django.urls import path
from core.views import robots_txt

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

你可以再次测试效果了。

测试

按照上面的写法,我们可以写一个单元测试。

core/tests/test_views.py中写入如下代码:

代码语言:javascript
复制
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执行上面的测试代码。

Django-Robots

当然,如果你想在数据库中对robots.txt的规则进行控制,比较简单的一个方法是使用第三方插件django-robots(地址:https://django-robots.readthedocs.io/en/latest/),我没有使用过它,但看起来很厉害。

希望以上这些对你有用。

原文链接:https://adamj.eu/tech/2020/02/10/robots-txt/

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-06-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 老齐教室 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 利用模板
  • 利用视图函数
  • 测试
  • Django-Robots
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档