Почему у меня дублируются представления в urls.py моего фреймворка Django rest?
Я пытаюсь понять, как эти конечные точки работают в django rest framework.
urls.py
urlpatterns = [
path('api-auth', include('rest_framework.urls', namespace='rest_framework')),
path('login', django_views.LoginView.as_view(template_name='rest_framework/login.html'), name='login'),
path('logout', django_views.LogoutView.as_view(), name='logout'),
path('register', views.UserCreate.as_view()),
path('get_jwt_token', obtain_jwt_token),
path('eos_verify_jwt_token', views.EOSVerifyJSONWebToken.as_view()),
]
Я получаю следующие шаблоны:
Using the URLconf defined in ugh_studios_webservices.urls, Django tried these URL patterns, in this order:
api/ api-auth login/ [name='login']
api/ api-auth logout/ [name='logout']
api/ login [name='login']
api/ logout [name='logout']
api/ register
api/ get_jwt_token
api/ eos_verify_jwt_token
admin/
The current path, api/api-auth, didn’t match any of these.
Почему существует две конечные точки входа?
Я пытаюсь сделать следующие конечные точки:
- Login Endpoint
- Logout Endpoint
- User registration endpoint
- JWT Token request + validation endpoints - this seems to work
- Custom Validate user login (username + password) endpoint (response needs to be custom for integration with a separate application, it expects a certain response body)
- Needs to be viewable in the browsable API https://www.django-rest-framework.org/topics/browsable-api/ - Why are none of my urls viewable except for the 'register' url?
- Needs to be able to work with both an HTTP POST request (for validation/login) as well as an html template/view
Я также не хочу создавать дублирующий код, похоже, что rest_framework поставляется с некоторыми представлениями по умолчанию для входа и выхода. Вся информация, которую я вижу на stack overflow, рекомендует создавать новые классы представлений... и т.д. Но зачем мне это делать, если rest framework предоставил мне некоторые стандартные представления, которые я просто не настроил должным образом? Мне кажется, что в rest framework уже есть все необходимое, но у меня неправильно настроен urls.py.
РЕДАКТИРОВАНИЕ:
Похоже, что я получаю именно то, что хочу, после изменения шаблонов url на следующие:
urlpatterns = [
path('', include('rest_framework.urls', namespace='rest_framework')),
path('register', views.UserCreate.as_view()),
path('get_jwt_token', obtain_jwt_token),
path('eos_verify_jwt_token', views.EOSVerifyJSONWebToken.as_view()),
]
Однако мне все еще нужно понять, как сделать так, чтобы логин направлял на нужные адреса. Кажется, что после входа в систему он перенаправляется на /accounts/profile. Однако я не вижу html-шаблона по умолчанию для этого, так что, возможно, такого шаблона не существует?
Не понял вашего вопроса - вот мое объяснение.
По моему мнению, существует 3 логина -
Когда мы заходим на
localhost:8000/admin, чтобы перейти в вашу админ панель, она ведет нас наhttp://localhost:8000/admin/login/?next=/admin/Когда у нас установлен rest framework и мы включили urls rest framework в наш файл project.url, что-то вроде
.path('api-auth/', include('rest_framework.urls')), когда мы проверяем пакет rest framework, он имеет файл urls.py и содержит login url -path('login/', views.LoginView.as_view(template_name='rest_framework/login.html'), name='login')и этот LoginView приходит из -django/contrib/auth/views
Теперь, когда вы проверяете этот класс (LoginView), в нем есть код -
def get_success_url(self):
url = self.get_redirect_url()
return url or resolve_url(settings.LOGIN_REDIRECT_URL)
и значение login_redirect_url по умолчанию '/accounts/profile/', проверьте это . Так вы будете перенаправлены туда, вы можете изменить значение в настройках.
Теперь мы можем войти непосредственно в наши api энпоинты с url типа localhost:8000/api-auth/login/ (rest framework login), но когда мы пытаемся войти через фронтенд клиент, например react приложение, используя аутентификацию на основе токенов, мы получаем ошибку CSRF токена с этим url.
- Теперь для входа в систему с токен-аутентификацией нам нужен rest-auth. (он генерирует токен). Мы снова включаем
path('rest-auth/', include('rest-auth.urls')), и у нас есть урлы типаrest_auth/login. И когда вы проверяете сериализатор класса login, он использует allauth. поэтому мы должны получить allauth тоже. Allauth позволяет нам управлять входом по имени пользователя или по электронной почте или по обоим.
