Django url 的优先级

Sha*_*mim 3 django django-urls django-rest-framework

我一直在使用 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>/

有时,当我点击任何网址时,另一个网址就会被触发。假设我击中了/api/user/<str:user_uniq_id>/api/user/signin/被叫了。

我该如何解决这个问题?

django url 有排序优先级吗?

Wil*_*sem 5

简短的回答:制作不重叠的图案。

问题是你的模式重叠。事实上,如果 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>/
Run Code Online (Sandbox Code Playgroud)

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

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