【问题标题】:Precedence of Django urlDjango url 的优先级
【发布时间】:2020-04-25 20:17:50
【问题描述】:

我一直在使用由 django rest 框架开发的电子商务平台。 url 的数量每天都在增加,并且有许多设计结构相似的 API 端点(url)。

如:

/api/user/<str:user_uniq_id>/

/api/user/sigin/

/api/user/registration/

/api/user/invitation/edit/

/api/user/invitation/<str:uniq_id>/

有时当我点击任何 url 时,另一个 url 会被触发。假设我点击了/api/user/<str:user_uniq_id>,但/api/user/signin/ 被调用了。

我该如何解决这个问题?

django url 有没有排序优先级?

【问题讨论】:

  • 那么您的<str:user_uniq_id> 将捕获所有其他模式,例如signin 等。

标签: django django-rest-framework django-urls


【解决方案1】:

简答:制作非重叠模式。

问题在于您的模式重叠。实际上,如果 url 是 /api/user/signin/,并且 /api/user/<str:user_uniq_id>/ 是您的 URL 列表中的第一个模式,它将匹配该模式。事实上,由于<str:user_uniq_id> 可以简单地与signin 统一。列表中后面还有另一个 url 也匹配的事实是不相关的。

因此,您应该设计非重叠模式。这意味着不能由一种模式生成的 url 可以由另一种模式生成。

例如,您可以将网址设计为:

/api/user/details/<str:user_uniq_id>/
/api/user/signin/
/api/user/registration/
/api/user/invitation/edit/
/api/user/invitation/details/<str:uniq_id>/

通过这样使用/details,URL /api/user/sigin 无法匹配第一个模式,因为它需要包含/api/user/details 作为前缀。

或者,您可以将/api/user/signin 路径放在路径列表的首位。但这对我来说似乎不是一个好主意。如果稍后用户拥有uniq_id 只是'signin'(是的,这可能看起来很少见,但最终可能会发生),那么该用户将看不到他/她的“详细信息”页面。

【讨论】:

    【解决方案2】:

    您可以简单地将所有预定义的url放在前面,如下所述,这样如果url匹配它们就会命中它,否则它会移动到其他url。

    /api/user/sigin/
    
    /api/user/registration/
    
    /api/user/<str:user_uniq_id>/
    
    /api/user/invitation/edit/
    
    /api/user/invitation/<str:uniq_id>/
    
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-17
      • 2011-08-17
      • 1970-01-01
      • 1970-01-01
      • 2011-12-20
      • 1970-01-01
      • 2011-06-25
      • 1970-01-01
      相关资源
      最近更新 更多