Regex Django urlpatterns的拖尾斜杠问题令人沮丧

Regex Django urlpatterns的拖尾斜杠问题令人沮丧,regex,django,url-pattern,urlconf,Regex,Django,Url Pattern,Urlconf,我能找到的所有django站点的urlpatterns示例都有一个单独的条目,用于没有前导斜杠或根文件夹的传入URL。然后,它们处理每行上的子文件夹。我不明白为什么一个简单的 /? 正则表达式不允许它们位于一个简单的行上 考虑以下内容,让我们将Django项目称为Baloney,应用程序名为Cheese。因此,在项目urls.py中,我们有类似的东西,允许应用程序urls.py处理它的请求 urlpatterns = patterns('', (r'^cheese/', include

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

/?
正则表达式不允许它们位于一个简单的行上

考虑以下内容,让我们将Django项目称为Baloney,应用程序名为Cheese。因此,在项目urls.py中,我们有类似的东西,允许应用程序urls.py处理它的请求

urlpatterns = patterns('',
    (r'^cheese/', include('Baloney.Cheese.urls')),
)
然后在Cheese apps url.py中,我不明白为什么这一简单的行不会对所有传入的url子路径触发为true,包括一个空白值

urlpatterns = patterns('',
    (r'^(?P<reqPath>.*)/?$', views.cheeseapp_views),
)
基本上,我想捕获reqPath变量以包含任何内容(即使是空白或“”),但如果有尾随斜杠,则不包括任何尾随斜杠

url是从DB中提取的动态段塞,因此我会对视图中的内容进行所有匹配,只需要url模式来转发值。我知道下面的方法是有效的,但我不明白为什么不能将所有这些都放在一行/?结尾$符号前的正则表达式

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

非常感谢您的见解。

我刚刚尝试了一个类似的示例,它与您编写的一样有效。不需要/?,*无论如何都会匹配。您得到的确切错误是什么?也许您的视图没有请求参数?即视图。cheeseapp_视图应类似于:

def cheeseapp_views(request, reqPath):
    ...
编辑:

您建议的模式将尾部斜杠捕捉到reqPath中,因为*运算符是贪婪的(请看)。请尝试以下方法:

(r'^(?P<reqPath>.*?)/?$', views.cheeseapp_views) 
(r'^(?P.*?/?$,视图。cheeseapp\u视图)

注意它是。*?我不能回答你的问题,但我肯定你的意思是r'^(?p.*)/?$。否则,您的尾部斜杠将始终包含在reqPath中。我“一直”都在这样做,而且它始终有效。你在这里粘贴了你的准确代码吗?卡巴邦加-后面的额外问号是什么。*做什么?*正则表达式是0个字符还是数百万个字符@Tomasz,我提供的最后一个代码示例是什么起作用。我的问题是将这两行组合成一个模式,使reqPath=if just/cheese或/cheese/为“”(空白),但返回其后出现的所有内容,包括除尾随斜杠(如果有)之外的任何其他斜杠。如果有尾随斜杠,我不希望。*包含尾随斜杠(如果有)。那个?不行,我的问题是为什么不行。domain.com/baloney/cheese/>希望此项匹配且reqPath将=''domain.com/baloney/cheese/ANYTHINGELSE-OR/9382091/etcetc/>希望此项匹配且reqPath将='ANYTHINGELSE-OR/9382091/etcetc'我不明白我建议的模式为什么不允许此项。。。(r'^(?P.*)/?$,views.cheeseapp_views)好的,首先-您提供的regexp与URL匹配。当您在问题中说“不匹配”时,我认为它根本不匹配,即您从Django获得“未找到页面(404)”。这就是我回答时的想法。其次,您建议的模式将尾部斜杠捕捉到reqPath中,因为*运算符是贪婪的(请看一看)。请尝试以下操作:
(r'^(?P.*?/?$,views.cheeseapp\u views)
-注意它是。*?而不是。*让它变得不贪婪。非常感谢您的回复和回答。如果你把你的评论作为一个答案,我绝对会把它标记为这个问题的答案。我已经扫描了相当多的重新Python文档页面,但从未达到如此重要的详细程度。非常感谢。
(r'^(?P<reqPath>.*?)/?$', views.cheeseapp_views)