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

标签 python 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??

最佳答案

Django 的一个 core design philosophiesURLs should be be beautiful.

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

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

由于 users/awesomeUserusers/awesomeUser/ 不同,

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

  2. 如果用户位于 users/awesomeUser/,浏览器会将其解析为 users/awesomeUser/about.html,因为尾部有斜杠

  • child relative to family/parent/ is family/parent/child.
  • child relative to family/parent is family/child.

Django Design philosophy on Definitive URLs阅读,

Technically, foo.com/bar and foo.com/bar/ are two different URLs, and search-engine robots (and some Web traffic-analyzing tools) would treat them as separate pages. Django should make an effort to “normalize” URLs so that search-engine robots don’t get confused.

This is the reasoning behind the APPEND_SLASH setting. (APPEND_SLASH lets you force append slashes to a 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 推荐附加斜杠,但并不强制。

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

关于python - 为什么 Django 网址以斜线结尾?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42212122/

相关文章:

python - 使用 Numpy polyadd() 添加两个多项式

python - 如何从 Gunicorn 的 pre_fork Hook 访问我的应用程序?

python - 运行时警告 : invalid value encountered in double_scalars app. launch_new_instance()

python - 使用ForeignKey关系将数据保存到Django中的模型中

python - Django 世界中的项目和应用程序有什么区别?

python - 安装 Python 模块 - SpiDev

python - Django channel 中的消费者

python - 为什么 azure 应用程序服务 django 部署不断失败?

Django - ImageField Blank=True 不起作用

python - 在 Pandas 的条件下删除重复行