在Django URL中使用斜杠命名的组

时间:2018-02-02 22:09:34

标签: python regex django 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格式的情况下克服此问题?

1 个答案:

答案 0 :(得分:1)

斜线是斜线,无论它是否被引用。这是它在RFC中的定义,以及Django(正确)如何处理它。除非未加引号的实体是具有特定含义的保留字符,否则Web服务器不应区分url路径中的引用和未引用实体。

你可以做的是先把更具体的网址。 Django总是使用第一个匹配的网址,因此以/action_1/action_2结尾的通话将被路由到更具体的网址,其他所有内容都会回退到更一般的网址。然后,您可以更改捕获组以接受斜杠:

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),
]