为什么Django url以斜线结尾?

2024-05-19 19:28:57 发布

您现在位置:Python中文网/ 问答频道 /正文

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

Tags: djangoname文档weburl官方ishtml
3条回答

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

在上面的例子中所说的,把它排除在外可能是有意义的。

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

因此,像accounts/detail?name='abc'这样的url应该映射为accounts/detail/abc/。您可以在url配置中使用regex捕获它。这里的网址是相当整洁和用户友好。这将有助于搜索引擎正确索引您的页面(现在您可以忘记rel=canonical),并将有助于搜索引擎优化。

现在,考虑一个拖尾斜杠的原因,对于路径为about.html的用户来说,一个相对解析users/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方法还可能有其他问题。

更新

除非在“设置”中显式定义APPEND_SLASH=False,并且为每个要使用的路由器(如果使用路由器)定义trailing_slash=False,否则无法使POST/PUT/PATCH/DELETE方法与rest_framework一起工作。这就好像你基本上会跳过这个大部分时间,你得浪费很多时间调试这个。Django建议使用append slashes,但不强制使用。

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

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

a search-engine indexer would treat them as separate URLs – so it’s best practice to normalize URLs.

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

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

相关问题 更多 >