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 philosophies是URLs should be be beautiful.
所以像 accounts/detail?name='abc'
这样的一些 url 应该被映射为 accounts/detail/abc/
强>。您可以在您的 url 配置中使用正则表达式捕获它。这里的 URL 非常简洁且用户友好。这将有助于搜索引擎正确地为您的页面编制索引(现在您可以忘记 rel=canonical
)并且有助于 seo。
现在是尾部斜杠的原因,考虑一个 View (在任何框架中)相对解析 about.html
路径中的用户,用户/awesomeUser
由于 users/awesomeUser
和 users/awesomeUser/
不同,
如果用户位于
users/awesomeUser
,浏览器会将其解析为users/about.html
,因为我们没有尾部斜线不想如果用户位于
users/awesomeUser/
,浏览器会将其解析为users/awesomeUser/about.html
,因为尾部有斜杠
child
relative tofamily/parent/
isfamily/parent/child
.child
relative tofamily/parent
isfamily/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)
还是不相信?
- 由于 django 观察到两个不同的 url,如果您正在缓存您的应用程序,Django 将在
user/awesomeUser
和user/awesomeUser/
为同一页面保留两个副本. - 如果您不将斜杠附加到 URL(如果您曾经计划构建 REST API),那么您在使用 GET 之外的 HTTP 方法时肯定会遇到问题。
更新
你不能使 POST/PUT/PATCH/DELETE 方法与 rest_framework
一起工作,除非你在设置中明确定义 APPEND_SLASH=False
和 trailing_slash=False
用于您必须使用的每个路由器(如果您使用路由器)。 这就像你基本上会跳过大部分时间,你必须浪费大量时间来调试它。 Django 推荐附加斜杠
,但并不强制。
由开发人员决定是否附加斜杠。
关于python - 为什么 Django 网址以斜线结尾?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42212122/