Почему у меня дублируются представления в 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.

Почему существует две конечные точки входа?

Я пытаюсь сделать следующие конечные точки:

  1. Login Endpoint
  2. Logout Endpoint
  3. User registration endpoint
  4. JWT Token request + validation endpoints - this seems to work
  5. Custom Validate user login (username + password) endpoint (response needs to be custom for integration with a separate application, it expects a certain response body)
  6. 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?
  7. 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.

enter image description here

РЕДАКТИРОВАНИЕ:

Похоже, что я получаю именно то, что хочу, после изменения шаблонов 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 логина -

  1. Когда мы заходим на localhost:8000/admin, чтобы перейти в вашу админ панель, она ведет нас на http://localhost:8000/admin/login/?next=/admin/

  2. Когда у нас установлен 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.

  1. Теперь для входа в систему с токен-аутентификацией нам нужен rest-auth. (он генерирует токен). Мы снова включаем path('rest-auth/', include('rest-auth.urls')), и у нас есть урлы типа rest_auth/login. И когда вы проверяете сериализатор класса login, он использует allauth. поэтому мы должны получить allauth тоже. Allauth позволяет нам управлять входом по имени пользователя или по электронной почте или по обоим.
Вернуться на верх