Как войти на уровне API с помощью субдомена django -hosts и DRF - PullRequest
2 голосов
/ 12 февраля 2020

Я использую django -rest-framework (DRF), чтобы иметь доступный для просмотра API, который должен быть доступен в поддомене api, например, api.localhost:8000. Для обслуживания поддоменов я использую django -hosts . У меня проблемы с достижением функций входа и выхода из системы на уровне API (т. Е. В поддомене api).

Субдомены работают, но я больше не могу заставить механизм аутентификации DRF работать.

Проблема

Посещение api.localhost:8000/ показывает доступную для просмотра страницу API. Кнопка входа в систему DRF также доступна. При использовании этой кнопки отображается форма входа в систему, но при отправке формы я перенаправляюсь на http://login/, что, конечно, не может быть решено, и, следовательно, вход в систему не удается. То же самое относится и к функциональности выхода из системы, что приводит к http://logout/ и также приводит к сбою. Ниже приведены скриншоты для этих шагов.

Django Настройки

ROOT_URLCONF = "server.urls"
ROOT_HOSTCONF = "server.hosts"
DEFAULT_HOST = "api"

django -конфигурация хостов

# server/hosts.py
from django_hosts import patterns, host
from django.conf import settings

host_patterns = patterns(
    '',
    host(r"api", "server.api_urls", name="api"),
    host(r"admin", "server.admin_urls", name="admin"),
    host("", settings.ROOT_URLCONF),  # resolves to server/urls.py
)

Конфигурация URL-адресов

# server/urls.py
from django.urls import include, path

# this is my root url conf
urlpatterns = [
    path("", include("server.api_urls")),
    path("", include("rest_framework.urls", namespace='rest_framework')),
    path("", admin.site.urls),
]

Я не доволен этим, но, хотя я обслуживаю его в другом поддомене, не добавляя path("", admin.site.urls) к root conf urls, я всегда получаю 'admin' is not a registered namespace. По той же причине я включил rest_framework.urls здесь, потому что в противном случае пространство имен rest_framework не было зарегистрировано.

# server/api_urls.py
urlpatterns = [
    path("", include('rest_framework.urls', namespace='rest_framework')),    
    path("", include("myapp.urls")),  # here is the DRF routing
]

Чтобы использовать механизм аутентификации DRF и кнопки Log in и Log out, Я включаю rest_framework.urls в пространство имен, которое я зарегистрировал ранее. После этого включены обычные URL-адреса приложений, которые маршрутизируют конечную точку API users, показанную на снимке экрана ниже.

# server/admin_urls.py
from django.contrib import admin

urlpatterns = [
    path("", admin.site.urls),
]

Снимки экрана

При посещении api.localhost:8000/ отображается страница API с возможностью просмотра.

Page at http://api.localhost:8000/

Использование кнопки Log in перенаправляет на http://api.localhost:8000/login/?next=/, что нормально.

Page at ttp://api.localhost:8000/login/

Но после отправки формы, я перенаправлен на http://login/, что, конечно, не может быть решено, и, следовательно, вход в систему не удается. То же самое относится к функциональности выхода из системы, которая приводит к http://logout/, а также к сбою.

Login Fail

Как я могу исправить механизм аутентификации для работы на API -уровень

...