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

san*_*joe 2 regex django url-pattern urlconf

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

/?
Run Code Online (Sandbox Code Playgroud)

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

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

urlpatterns = patterns('',
    (r'^cheese/', include('Baloney.Cheese.urls')),
)
Run Code Online (Sandbox Code Playgroud)

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

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

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

http://baloneysite.com/cheese/        -->   MATCHES THE PATTERN
http://baloneysite.com/cheese/swiss   -->   DOES NOT MATCH
Run Code Online (Sandbox Code Playgroud)

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

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

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

欣赏任何见解.

icy*_*com 9

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

def cheeseapp_views(request, reqPath):
    ...
Run Code Online (Sandbox Code Playgroud)

编辑:

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

(r'^(?P<reqPath>.*?)/?$', views.cheeseapp_views) 
Run Code Online (Sandbox Code Playgroud)

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