Шаблон URL сторонней библиотеки Django перед пользовательским шаблоном URL? (порядок шаблонов URL)

#python #django #django-rest-framework #django-rest-auth

#python #django #django-rest-framework #django-rest-auth

Вопрос:

Используя Django (REST Framework), это мой корневой URL conf :

 ... (imports)

urlpatterns = [
    re_path(r"^confirm-email/(?P<key>[-:w] )/$", accounts_views.email_verification,
            name="account_confirm_email"),
    path('admin/', admin.site.urls),
    path('request/', include('request.urls')),
    path('rest-auth/', include('rest_auth.urls')),
    path('rest-auth/registration/', include('rest_auth.registration.urls')),
    re_path(r'^account-confirm-email/', TemplateView.as_view(),
            name='account_email_verification_sent'),
]
  

теперь я использую библиотеку django-rest-auth для аутентификации. Эта библиотека отправляет электронное письмо пользователю после отправки регистрационной формы с целью активации адреса электронной почты пользователя.

В этом электронном письме есть ссылка, которая получается путем изменения шаблона URL, шаблон URL с именем: account_confirm_email

библиотека django-rest-auth поставляется с собственным шаблоном URL с именем account_confirm_email, если быть точным, в следующем файле:

python3.7/site-packages/rest_auth/registration/urls.py:

 ... (imports)

urlpatterns = [
    ...
    url(r'^account-confirm-email/(?P<key>[-:w] )/$', TemplateView.as_view(),
        name='account_confirm_email'),
]
  

Я ожидаю, что мой собственный шаблон URL-адреса будет обратным, а не rest-auth, поскольку мой идет первым по порядку. Как указано в документах Django:

Django просматривает каждый шаблон URL по порядку и останавливается на первом, который соответствует запрошенному URL.

https://docs.djangoproject.com/en/2.2/topics/http/urls/

Но на практике шаблон rest-auth — это тот, который отменяется, почему это происходит?

Для полноты я вижу, что в документах Django также говорится:

Django определяет корневой модуль URLconf для использования. Обычно это значение параметра ROOT_URLCONF, но если входящий объект HttpRequest имеет атрибут urlconf (установленный промежуточным программным обеспечением), его значение будет использоваться вместо параметра ROOT_URLCONF.

https://docs.djangoproject.com/en/2.2/topics/http/urls/

Выполняет ли django-rest-auth то, что описано в приведенной выше цитате из документов Django? И если да, возможно ли по-прежнему изменить мой собственный шаблон URL-адреса перед шаблоном django-rest-auth? (И как бы я это сделал?)

Комментарии:

1. Ваши цитаты из документов на самом деле не применимы к той же ситуации, что и у вас здесь — они говорят о том, что происходит, когда делается запрос на конкретный URL-адрес, и Django ищет, какую функцию просмотра вызывать, что не обязательно совпадает с порядком, который он проверяет на обратное соответствие (поиск URL-адреса на основе имени, которое ему дано). Я только что проверил документы и до сих пор не нашел никакой информации о том, в каком порядке это происходит — логически это было бы то же самое, но, возможно, это не так? Было бы неплохо выяснить так или иначе.

Ответ №1:

Ожидается, что он будет вести себя именно так, потому что URLPattern, который вы написали, не будет соответствовать URL, присутствующему в электронном письме, отправленном через библиотеку django-rest-auth.

Замените эту строку:

 re_path(r"^confirm-email/(?P<key>[-:w] )/$", accounts_views.email_verification, name="account_confirm_email"),
  

Для этого:

 re_path(r"^account-confirm-email/(?P<key>[-:w] )/$", accounts_views.email_verification, name="account_confirm_email"),
  

Комментарии:

1. Я проголосовал против, потому что я говорю о шаблоне URL с именем account_confirm_email, который я уже добавил в свой собственный корневой файл url conf с включенным регулярным выражением. Шаблон URL, о котором вы говорите в нижней части моего списка, мой вверху.

2. @RikSchoonbeek Поправьте меня еще раз, если я ошибаюсь, но я считаю нормальным, что тот, о котором вы говорите, не вводится в URL электронной почты, если он соответствует другому регулярному выражению, даже если у него такое же имя.

3. Обратный шаблон URL-адреса называется «account_confirm_email». Другой re_path шаблон называется по-другому, а именно «account_email_verification_sent», и на самом деле это не имеет отношения к этому вопросу. Я надеюсь, что вы не принимаете мой отрицательный отзыв лично, но мне не очень понравилось, что в ответе уже было два положительных отзыва, хотя он не отвечает на мой вопрос. Ценю ваши усилия!

4. @RikSchoonbeek Я изменил свой ответ, теперь он может быть адаптирован к тому, что вам нужно. Если нет, я бы любезно попросил вас предоставить более подробную информацию о основной проблеме, которую вы хотите решить. PD: Приятно всегда обсуждать нерешенный вопрос, спасибо за ваши комментарии!