Старшинство Django URL - PullRequest
       16

Старшинство Django URL

3 голосов
/ 08 января 2020

Я работал с платформой электронной коммерции, разрабатывая django rest framework. Изо дня в день число 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?

Ответы [ 2 ]

4 голосов
/ 08 января 2020

Короткий ответ : сделать непересекающимися шаблонами.

Проблема заключается в том, что ваши шаблоны перекрываются. Действительно, если 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' (да, это может выглядеть редко, но в конечном итоге это может произойти), то этот пользователь не сможет увидеть свою страницу "подробностей".

1 голос
/ 08 января 2020

Вы можете просто поместить все предопределенные URL-адреса первыми, как упомянуто ниже, таким образом, если URL-адрес совпадает с ними, он попадет на него, в противном случае он переместится на другие URL-адреса.

...