Django 的优先级 url

Precedence of Django url

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

如:

/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 urls 有排序优先吗?

简答:制作非重叠模式。

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

因此你应该设计非重叠模式。所以这意味着没有 url 可以由一种模式生成,可以由另一种模式生成。

例如,您可以将 url 设计为:

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

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

或者,您可以将 /api/user/signin 路径放在路径列表的第一位。但这对我来说不是一个好主意。如果稍后用户 uniq_id 只是 'signin'(是的,这可能看起来很少见,但最终会发生),那么该用户将无法看到 his/her "details" 页面。

你可以简单地将所有预定义的 url 放在前面,如下所述,这样如果 url 与它们匹配则它会命中它,否则它会移动到另一个 urls.

/api/user/sigin/

/api/user/registration/

/api/user/<str:user_uniq_id>/

/api/user/invitation/edit/

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