我定义了一组以下网址:
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格式的情况下克服此问题?
答案 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),
]