【发布时间】:2016-01-21 16:07:44
【问题描述】:
我想从像
这样的所有 url 中捕获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.comexample.com/example.com/start
但不是为了
example.com/start/
有人能指出我的错误吗?
【问题讨论】:
-
将您的网址更改为: url(r'^(?P
[-\w]+)/?$', views.PageView.as_view(), name='page') , -
我只更改了 regx。而不是 '.+' 使用 '[-\w]+',这应该可以工作。
-
@anush 所说的,您当前的正则表达式太贪婪,并且作为
page的一部分也在最后抓住斜线,所以/?部分没有任何东西可以处理 -
您不需要
r'^/?$,r'^$'无论您输入example.com还是example.com/都可以正常工作。 -
如果您在日志中查看对
http://example.com和http://example.com/的请求,无论是否包含斜杠,您都会看到"GET / HTTP/1.1"。 Django 在解析 url 之前从请求中去除前导斜杠。所以如果你有r'^/$',它实际上会匹配//,这不是你想要的。在r'^$'中不需要前导斜杠,就像在r'^(?P<page>.+)'中不需要前导斜杠一样。 Django 1.9 将 check your url patterns 处理这个错误,以及其他几个错误。