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之一是网址应该很漂亮。

因此,应将诸如 accounts/detail?name='abc' 之类的URL映射为 accounts/detail/abc/ 。您可以在网址配置中使用正则表达式捕获它。在这里,URL非常简洁且易于使用。这将有助于搜索引擎正确索引您的页面(现在您可以忘记rel=canonical),并且对seo有所帮助。

现在是斜杠结尾的原因,请考虑一个 View (在任何框架中),该 View 相对于路径的用户 about.html

由于users/awesomeUserusers/awesomeUser不同,

  • 如果用户使用的是users/awesomeUser/,则浏览器会将其解析为users/awesomeUser,因为没有尾部斜杠,我们不希望
  • 如果用户使用的是users/about.html,则浏览器会将其解析为users/awesomeUser/,因为后面有一个斜杠



  • Django Design philosophy on Definitive URLs读取,



    还是不服气?
  • 由于django观察到两个URL都是不同的,因此,如果您要缓存应用程序,则Django将在users/awesomeUser/about.htmluser/awesomeUser的同一页面保留两个副本。
  • 如果您不将斜杠附加到URL(如果您计划构建REST API),则除GET之外,HTTP方法将出现问题。

  • 更新

    您不能使POST/PUT/PATCH/DELETE方法与user/awesomeUser/一起使用,除非您为要使用的每个路由器(如果使用路由器)在设置和rest_framework中明确定义APPEND_SLASH=False。就像您基本上会跳过大多数次,而您却要浪费大量时间调试它。 Django建议使用trailing_slash=False,但不要强行使用。

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

    08-27 06:20