【问题标题】:Why django urls end with a slash?为什么 django url 以斜杠结尾?
【发布时间】:2017-02-13 19:34:34
【问题描述】:

Django 官方文档和网络上的其他教程总是在 url 的末尾使用斜杠。例如:

url(r'^accounts/login/', views.login)  # login view in turn calls login.html

# instead of

url(r'^accounts/login', views.login)

既然accounts 是目录,login (login.html) 是文件,我们不应该使用第二个网址吗?这也将使GET 参数看起来更有条理:

accounts/login?name='abc'  # login is a file that is accepting parameters
vs.
accounts/login/?name='abc' # login directory (maybe index) is accepting parameters??

【问题讨论】:

    标签: python django


    【解决方案1】:

    Django 的core design philosophies 之一是网址应该很漂亮。

    所以像 accounts/detail?name='abc' 这样的 url 应该映射为 accounts/detail/abc/。您可以在您的 url 配置中使用正则表达式捕获它。这里的 URL 非常简洁且用户友好。这将有助于搜索引擎正确索引您的页面(现在您可以忘记rel=canonical),并将有助于搜索引擎优化。

    现在是斜杠的原因,考虑一个视图(在任何框架中),它相对解析路径上的用户 about.htmlusers/awesomeUser

    由于users/awesomeUserusers/awesomeUser/ 不同,

    1. 如果用户位于users/awesomeUser,浏览器会将其解析为users/about.html,因为没有我们不想要的斜杠

    2. 如果用户在users/awesomeUser/,浏览器会将其解析为users/awesomeUser/about.html,因为有一个斜杠

    • child 相对于 family/parent/family/parent/child
    • child 相对于 family/parentfamily/child

    Django Design philosophy on Definitive URLs 读取,

    从技术上讲,foo.com/barfoo.com/bar/ 是两个不同的 URL,并且是搜索引擎机器人(以及一些网络流量分析工具)会将它们视为单独的页面。 Django 应该努力“规范化” URL,以免搜索引擎机器人感到困惑。

    这是 APPEND_SLASH 设置背后的原因。(APPEND_SLASH 让您可以强制将斜杠附加到 URL)

    还是不服气?

    1. 由于 django 观察到这两个 url 是不同的,如果你正在缓存你的应用程序,Django 将在 user/awesomeUseruser/awesomeUser/ 为同一页面保留两个副本。
    2. 如果您不将斜杠附加到 URL(如果您计划构建 REST API),那么除了 GET 之外,您肯定会遇到 HTTP 方法的问题。

    更新

    您不能使 POST/PUT/PATCH/DELETE 方法与 rest_framework 一起使用,除非您在设置中明确定义 APPEND_SLASH=False 并为您必须使用的每个路由器(如果您使用路由器)定义 trailing_slash=False这就像你基本上会跳过这个大部分时间,你必须浪费大量时间来调试它。 Django 推荐append slashes,不强求。

    是否附加斜线由开发人员决定。

    【讨论】:

    • 这个答案解释了在浏览器如何解析其子链接方面使用和不使用斜杠的区别。但这并没有解释为什么 Django 选择一种特定的方式而不是另一种。我也不知道答案,但是,到目前为止,一开始似乎是一个随机的选择。从第 1 天开始,它可能会走向另一个方向,只要这些 URL 坚持一种形式,它们仍然是“确定的”。所以,对我来说,这似乎是那些编码风格的东西,即没有明确的对与错,只有约定。
    • 我很高兴 Django 没有强制执行这条规则,它也不应该强制执行,因为它会给那些可能正在使用多个后端的人带来地狱,这些后端使用不带斜杠的 url,或者在至少你必须重新配置 http 服务器的反向代理来处理这个问题
    【解决方案2】:

    “网址应该很漂亮”!!! 我希望能够控制 URL。当一切都将被覆盖时,这没什么好说的。在某些情况下,我做了一个重定向循环,这并不好笑。

    from django.http import HttpResponseRedirect as rdrct
    
    url(r'^sitemap.xml$', 'my_app.views.custom_sm'),
    
    url(r'^sitemap.xml/$', lambda x: rdrct('/sitemap.xml')),
    

    【讨论】:

    • xml后面有斜线吗?
    【解决方案3】:

    来自the docs 用于使用APPEND_SLASH 的中间件

    搜索引擎索引器会将它们视为单独的 URL,因此最好对 URL 进行规范化。

    django 不需要它,它只是试图通过建议一种标准的 url 处理方式来帮助您的 SEO。

    是的,我知道斜线与这个中间件无关,但这是我能找到的可能原因的最佳解释

    【讨论】:

    • 感谢您的回答,但我们一般在html页面中使用rel=canonical,让搜索引擎知道索引哪个链接
    • @TheWanderer - 当然,SEO 并不是 django 在文档中详细介绍的内容,而是尝试直接从教程中灌输 URL 的标准格式
    【解决方案4】:

    这有助于定义您网站的结构。尽管 django 可以支持在传递给服务器的域之后输入的任何内容,但通过这种方式,您可以轻松地将“子页面”添加到 url,而不会看起来像 accounts/loginreset?id=alkfjahgouasfjvn25jk1k25

    在上面的案例中说了这么多,把它排除在外可能是有意义的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-08
      • 2010-10-02
      • 1970-01-01
      • 2010-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-23
      相关资源
      最近更新 更多