#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: Приятно всегда обсуждать нерешенный вопрос, спасибо за ваши комментарии!