Django URL - 尾部斜杠被添加到变量值

时间:2014-02-24 11:34:37

标签: python django django-urls

我有一个用Apache托管的django应用程序。我正忙着使用django restframework来创建API,但我遇到了URL问题。例如,我有一个这样的URL:

url(r'path/to/endpoint/(?P<db_id>.+)/$', views.PathDetail.as_view())

如果我尝试访问此URL并且不包含尾部斜杠,则它将不匹配。如果我在最后添加一个问号:

url(r'path/to/endpoint/(?P<db_id>.+)/?', views.PathDetail.as_view())

匹配和不匹配斜杠。唯一的问题是如果使用尾部斜杠,它现在会包含在我视图中的db_id变量中。因此,当它搜索数据库时,id不匹配。我不想通过字符串处理来查看我的所有视图并从我的url变量中删除尾部斜杠。

所以我的问题是,使用和不使用尾部斜杠进行网址匹配的最佳方法是什么,而不在发送到视图的参数中包含尾部斜杠?

2 个答案:

答案 0 :(得分:5)

参数的模式为.+,表示任意字符中的一个或多个,包括/。难怪斜线包含在其中,为什么不呢?

如果您希望模式包含/以外的任何内容,请改用[^/]+。如果您希望模式在末尾包含除之外的任何内容,请使用.*[^/]作为模式。

答案 1 :(得分:4)

正则表达式的.+部分将匹配一个或多个字符。这场比赛是“贪婪的”,这意味着它将匹配尽可能多的角色。

退房:http://www.regular-expressions.info/repeat.html

在第一种情况下,/必须存在才能匹配完整模式。

在第二种情况下,当缺少斜杠时,模式将始终匹配,因为斜杠是可选的。

如果存在斜杠,则贪婪的db_id字段将扩展到结尾(包括斜杠),斜杠将不匹配任何内容,但整体模式仍将匹配,因为斜杠是可选的。

一些简单的解决方案是使用db_id修饰符?使(?P<db_id>.+?)/?非贪婪:或使字段与任何斜杠不匹配:(?P<db_id>[^/]+)/?