我可以找到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),
欣赏任何见解。
答案 0 :(得分:9)
我刚试了一个类似的样本,它就像你写的一样工作。不需要/?,。*无论如何都会匹配。你得到的确切错误是什么?也许你的视图没有请求参数?即views.cheeseapp_views应该是这样的:
def cheeseapp_views(request, reqPath):
...
编辑:
您建议的模式将尾部斜杠捕获到reqPath中,因为*运算符是贪婪的(请参阅docs.python.org/library/re.html)。试试这个:
(r'^(?P<reqPath>.*?)/?$', views.cheeseapp_views)
注意它是。*?而不是。*使它不贪婪。