为什么django urls以斜线结尾?

时间:2017-02-13 19:34:34

标签: python django

Django官方文档和Web上的其他教程总是在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??

4 个答案:

答案 0 :(得分:16)

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

因此,像 accounts/detail?name='abc' 这样的网址应该映射为 accounts/detail/abc/ 。您可以在网址配置中使用正则表达式捕获它。这里的URL非常整洁,用户友好。这将有助于搜索引擎正确索引您的网页(现在您可以忘记rel=canonical)并在seo中提供帮助。

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

由于users/awesomeUserusers/awesomeUser/不同,

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

    < / LI>
  2. 如果用户位于users/awesomeUser/,则浏览器会将其解析为users/awesomeUser/about.html,因为有一个尾随斜杠

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

    Django Design philosophy on Definitive URLs读取,

      

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

         

    这是APPEND_SLASH设置背后的原因。(APPEND_SLASH允许您强制向网址添加斜杠)

    还是不相信?

    1. 由于django将两个网址视为不同,如果您要缓存您的应用,Django会在user/awesomeUseruser/awesomeUser/为同一网页保留两份副本。
    2. 如果您不将斜杠附加到URL(如果您计划构建REST API),则必须遇到GET以外的HTTP方法问题。
    3. 更新

      您不能使POST / PUT / PATCH / DELETE方法与rest_framework一起使用,除非您在设置中明确定义APPEND_SLASH=False并为每个路由器明确定义trailing_slash=False使用(如果您使用路由器)。 就像你基本上要跳过这个次数而且你要浪费很多时间来调试它。 Django建议append slashes并且不强迫它。

      由开发人员决定是否添加斜杠。

答案 1 :(得分:1)

这有助于定义您网站的结构。虽然django可以支持在传递给服务器的域之后输入的任何内容,但这样做可以让您轻松添加&#34;子页面&#34;到没有它看起来像accounts/loginreset?id=alkfjahgouasfjvn25jk1k25

的网址

在上述案例中,如果将其排除在外可能是有意义的。

答案 2 :(得分:1)

the docs获取使用APPEND_SLASH

的中间件
  

搜索引擎索引器会将它们视为单独的网址 - 因此最佳做法是对网址进行规范化。

它不是django所要求的,它只是通过建议一种标准的网址方式来帮助你的搜索引擎优化。

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

答案 3 :(得分:0)

“ URL应该很漂亮” !!! 我希望能够控制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')),