【问题标题】: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),
    ]
    

    【讨论】:

    • 完美,这正是我需要的!非常感谢。
    猜你喜欢
    • 1970-01-01
    • 2011-05-25
    • 1970-01-01
    • 2011-12-14
    • 1970-01-01
    • 1970-01-01
    • 2011-09-13
    • 2016-11-29
    相关资源
    最近更新 更多