3

我能找到的所有 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 变量以包含任何内容(甚至是空白或''),但不包括任何尾随斜杠(如果有的话)。

url 是从数据库中提取的动态 slug,因此我对视图中的内容进行了所有匹配,并且只需要 url 模式来转发值。我知道以下工作,但不明白为什么不能将其全部与/放在一行?结束 $ 符号之前的正则表达式。

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

欣赏任何见解。

4

1 回答 1

10

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

def cheeseapp_views(request, reqPath):
    ...

编辑:

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

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

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

于 2010-11-10T23:55:33.540 回答