忽略django url regex中的尾部斜杠

时间:2015-10-22 11:33:07

标签: regex django

我想从所有网址中抓住,比如

if (!toState.resolve) { toState.resolve = {} };example.com/<page_path>

example.com/<page_path>/部分。变量可以为空(重定向到<page_path>)或指向所需页面的路径(大多数情况下是一个简单的字符串,但也可以包含斜杠)

这是我目前的example.com/start似乎有效:

urls.py

但是现在我试图简化表达并想出了这个:

urlpatterns = [
    url(r'^/$', RedirectView.as_view(url="start"), name='index'),
    url(r'^$', RedirectView.as_view(url="start"), name='index'),
    url(r'^(?P<page>.+)/$', views.PageView.as_view(), name='page'),
    url(r'^(?P<page>.+)$', views.PageView.as_view(), name='page'),
]

我想捕捉所有内容,除非有斜杠。

奇怪的是,这适用于

  • urlpatterns = [ url(r'^/?$', RedirectView.as_view(url="start"), name='index'), url(r'^(?P<page>.+)/?$', views.PageView.as_view(), name='page'), ]
  • example.com
  • example.com/

但不适用于

  • example.com/start

有人可以指出我的错误吗?

2 个答案:

答案 0 :(得分:3)

有一个名为APPEND_SLASH的Django设置,默认值为True

  

当设置为True时,如果请求URL与URLconf中的任何模式都不匹配且它不以斜杠结尾,则会向相同的URL发出HTTP重定向并附加斜杠。请注意,重定向可能会导致POST请求中提交的任何数据丢失。

     

APPEND_SLASH设置仅在安装了CommonMiddleware时使用。

来源:Django documentation: Settings

答案 1 :(得分:2)

感谢您的评论,我可以解决这个问题:

urlpatterns = [
    url(r'^$', RedirectView.as_view(url="start"), name='index'),
    url(r'^(?P<page>.+?)/?$', views.PageView.as_view(), name='page'),
]

+量词太贪心,所以我用非贪婪的版本+?取而代之。