【问题标题】:Named groups with slashes in Django URLsDjango URL 中带有斜杠的命名组
【发布时间】:2018-02-02 22:09:33
【问题描述】:
我定义了一组以下 URL:
GET /data/(?P<tag>[^/]+)$
POST /data/(?P<tag>[^/]+)/action_1$
POST /data/(?P<tag>[^/]+)/action_2$
...
我想知道是否可以使用包含斜线的标签?
例如,当我尝试获取标签 a/b/c 的数据时,我总是得到 404 错误。尽管我在形成实际 URL 之前引用了标签(即前一种情况下的 /data/a%2Fb%2Fc),但获得的 URL 仍然不匹配(尽管 a%2Fb%2Fc 应该匹配 [^/]+),因为看起来 Django 执行了隐式取消引用,这是不希望的.如何在不更改 URL 形成方案的情况下解决此问题?
【问题讨论】:
标签:
python
regex
django
url
【解决方案1】:
斜线是斜线,不管它是否被引用。这就是它在 RFC 中的定义方式,也是 Django(正确地)处理它的方式。网络服务器不应区分 url 路径中的引用实体和未引用实体,除非未引用实体是具有特定含义的保留字符。
您可以将更具体的网址放在首位。 Django 总是使用第一个匹配的 url,因此以/action_1 或/action_2 结尾的调用将被路由到更具体的 url,而其他一切都回退到更通用的 url。然后您可以更改捕获组以接受斜杠:
urlpatterns = [
url(r'^data/(?P<tag>.+)/action_1$', action1_view),
url(r'^data/(?P<tag>.+)/action_2$', action2_view),
url(r'^data/(?P<tag>.+)$', general_view),
]