Django urlpatterns令人沮丧的问题与尾随斜杠

时间:2010-11-10 23:32:08

标签: regex django url-pattern urlconf

我可以找到django站点的urlpatterns的所有示例都有一个单独的条目,用于没有前导斜杠的传入URL或根文件夹。然后他们处理每条线上的子文件夹。我不明白为什么简单

/?

正则表达式不允许这些在一个简单的行上。

考虑以下情况,让我们调用Django项目Baloney,App名称为Cheese。所以在项目urls.py中我们有这样的东西允许应用程序urls.py处理它的请求......

urlpatterns = patterns('',
    (r'^cheese/', include('Baloney.Cheese.urls')),
)

然后在Cheese应用程序urls.py中,我不明白为什么这一条简单的行不会对所有传入的url子路径都触发,包括空值...

urlpatterns = patterns('',
    (r'^(?P<reqPath>.*)/?$', views.cheeseapp_views),
)

相反,它匹配空白案例,但不是存在值的情况。所以......

http://baloneysite.com/cheese/        -->   MATCHES THE PATTERN
http://baloneysite.com/cheese/swiss   -->   DOES NOT MATCH

基本上我想捕获reqPath变量以包含其中的任何内容(甚至是空格或''),但如果有的话,不包括任何尾部斜杠。

网址是从数据库中提取的动态slu ..所以我在视图中完成所有匹配内容,只需要url模式来转发值。我知道以下工作,但不明白为什么这不能全部放在一行/?结束$符号前的正则表达式。

(r'^$', views.cheeseapp_views, {'reqPath':''}),
(r'^(?P<reqPath>.*)/$', views.cheeseapp_views),

欣赏任何见解。

1 个答案:

答案 0 :(得分:9)

我刚试了一个类似的样本,它就像你写的一样工作。不需要/?,。*无论如何都会匹配。你得到的确切错误是什么?也许你的视图没有请求参数?即views.cheeseapp_views应该是这样的:

def cheeseapp_views(request, reqPath):
    ...

编辑:

您建议的模式将尾部斜杠捕获到reqPath中,因为*运算符是贪婪的(请参阅docs.python.org/library/re.html)。试试这个:

(r'^(?P<reqPath>.*?)/?$', views.cheeseapp_views) 

注意它是。*?而不是。*使它不贪婪。