没有尾部斜杠的django网址不会重定向

wha*_*hat 78 python django django-urls

我在两台独立的计算机上安装了两个应用程序.在计算机A上,在urls.py文件中我有如下行:

(r'^cast/$', 'mySite.simulate.views.cast')
Run Code Online (Sandbox Code Playgroud)

该网址将会对工作都mySite.com/cast/mySite.com/cast.但是在计算机上有一个类似的URL写出来像:

(r'^login/$', 'mySite.myUser.views.login')
Run Code Online (Sandbox Code Playgroud)

出于某种原因,在计算机B上url mySite.com/login/将会工作但是mySite.com/login会挂起并且不会mySite.com/login/像计算机A那样直接返回.是否有我遗漏的东西?这两个url.py文件看起来都和我一样.

Mic*_*din 180

或者你可以像这样写你的网址:

(r'^login/?$', 'mySite.myUser.views.login')
Run Code Online (Sandbox Code Playgroud)

尾部斜杠后的问号在regexp中使其成为可选项.如果由于某些原因您不想使用APPEND_SLASH设置,请使用它.

  • 如果您使用Django创建RESTful API,那么当开发人员将数据直接发送到端点URL时,这可能是一个很好的解决方案.当使用`APPEND_SLASH`时,如果他们意外地发送它而没有斜杠,并且你的urlconf是带有斜杠的,那么在重定向POST请求时他们会得到关于数据丢失的异常. (43认同)
  • 非常确定您不希望出于搜索引擎优化的原因这样做 - 更好地重定向到规范的URL而不是具有两个有效的URL. (39认同)
  • 叫我天真 - 但为什么这个答案没有得到一百万的赞成票和django常见问题? (9认同)
  • 这个解决方案的问题在于你在2个url下使用相同的页面(有和没有尾随的`/`) - 草率,对于爬虫来说不好,更难维护,更难迁移到新系统(因为它很容易俯瞰) (5认同)
  • 这是一个离题的话题(Django/Python),但作为具有多年 SEO 经验的人,我可以告诉你,如果你想优化搜索引擎,你不需要同一 URL 的 2 个版本。site.com/users 与 site.com/users/ 是不同的网址,这不是您想要的 SEO。您只需要 1 个版本的网址和内容!仅选择 1 个版本,并确保正确重定向另一个版本。 (3认同)

Jia*_*aro 96

检查APPEND_SLASHsettings.py文件中的设置

更多关于django文档的信息

  • "当设置为True时,如果请求URL与URLconf中的任何模式都不匹配且不以斜杠结尾,则会向相同的URL发出HTTP重定向并附加斜杠.请注意,重定向可能会导致在POST请求中提交的任何数据都将丢失." "APPEND_SLASH设置仅在安装CommonMiddleware时使用......".我更喜欢Michael Gendin的解决方案. (4认同)
  • 如果您在urlpatterns的最后一个条目中使用其他“全部捕获” URL,则此方法不起作用。即使在这些情况下,@ speedplane的答案也将起作用。但是,当然,这比较简单,如果没有“全部捕获” urlpattern条目,则应使用它。 (2认同)

spe*_*ane 17

这改善了@Michael Gendin的答案.他的回答是使用两个单独的URL提供相同的页面.最好login自动重定向到login/,然后将后者作为主页面提供服务:

from django.conf.urls import patterns
from django.views.generic import RedirectView

urlpatterns = patterns('',
    # Redirect login to login/
    (r'^login$', RedirectView.as_view(url = '/login/')),
    # Handle the page with the slash.
    (r'^login/', "views.my_handler"),
)
Run Code Online (Sandbox Code Playgroud)