为什么 Django 网址以斜线结尾?

新手上路,请多包涵

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) 是文件,我们不应该使用第二个 url 吗?这也将使 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??

原文由 The Wanderer 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 901
2 个回答

Django 的 核心设计理念 之一是 URL 应该是漂亮的。

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

现在尾部斜杠的原因,考虑一个视图(在任何框架中)相对解析 about.html 对于路径中的用户, users/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/ bar 和 foo.com/bar/ 两个不同的 URL,搜索引擎机器人(和一些 Web 流量分析工具)会将它们视为单独的页面。 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=Falsetrailing_slash=False 必须使用(如果你使用路由器)。 _这就像你基本上大部分时间都会跳过这个_,你必须浪费大量时间来调试它。 Django 推荐 append slashes 并不强制。

是否附加斜杠取决于开发人员。

原文由 All Іѕ Vаиітy 发布,翻译遵循 CC BY-SA 4.0 许可协议

来自使用 APPEND_SLASH 的中间件 的文档

搜索引擎索引器会将它们视为单独的 URL——因此最佳做法是规范化 URL。

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

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

原文由 Sayse 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏