DRF - впечатляющая проблема с пользовательским интерфейсом при расширении новой аутентификации TokenAuthentication для DRF

при расширении нового класса аутентификации токена из rest_framework_simplejwt.authentication.JWTAuthentication кнопка авторизации drf-Spectular swagger-ui исчезает, и нет возможности добавить носителя токена, я думаю, когда вы подклассифицируете, это идет не так.
шаги для воспроизведения: во-
первых, создайте проект Django с остальной структурой и drf-впечатляющим и простым jwt, установленным и настроенным с руководством по документации. попал в / swagger-ui /, и он отлично работает.
затем создайте подкласс JWTAuthentication, как показано ниже:

      from rest_framework_simplejwt.authentication import JWTAuthentication as JWTA

class JWTAuthentication(JWTA):
    pass

и в ваших настройках:

      REST_FRAMEWORK = {
    'DEFAULT_SCHEMA_CLASS': 'drf_spectacular.openapi.AutoSchema',
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'path_to_your_module.JWTAuthentication',
    ),
}

и теперь, если вы перейдете в / swagger-ui /, то кнопки авторизации нет!!! Как я могу это исправить?
и я даже попытался создать AuthenticationExtension, например:

      from drf_spectacular.contrib.rest_framework_simplejwt import SimpleJWTScheme

class SimpleJWTTokenUserScheme(SimpleJWTScheme):
    target_class = 'spec.test.JWTAuthentication'

но нет возможности зарегистрировать его нигде, ни в Интернете, ни в документации !! как я могу исправить кнопку авторизации при переопределении класса аутентификации ??

2 ответа

Решение

Обновление-1

из документа Где мне разместить свои расширения? / мои расширения не обнаружены

Расширения регистрируются автоматически. Только убедитесь, что интерпретатор Python видит их хотя бы один раз. С этой целью мы предлагаем создать PROJECT/schema.py файл и импортируя его в свой PROJECT/__init__.py (тот же каталог, что и и urls.py) с участием import PROJECT.schema. Пожалуйста, не импортируйте файл в settings.py так как это потенциально может привести к проблемам с циклическим импортом.


Оригинальный ответ

Похоже ошибка самого пакета. Вы можете использовать фактический класс вместо пути к классу при расширении расширения auth

      from drf_spectacular.contrib.rest_framework_simplejwt import SimpleJWTScheme
from path.to.custom.jwt.auth import JWTAuthentication

class SimpleJWTTokenUserScheme(SimpleJWTScheme):
    target_class = JWTAuthentication

Я создал здесь простой пример, drf-spectacular-example, надеюсь, кому-то это будет выгодно !!!

Сложность этого класса расширения заключается в том, что он должен быть загружен / инициализирован во время запуска сервера Django. Думаю, вы бы разместили то, что не вызывается автоматически при запуске сервера.

Итак, просто убедитесь, что класс расширения инициализируется путем импорта SimpleJWTTokenUserScheme в settings.py (или какой-либо другой модуль, который инициализируется автоматически)

      # settings.py

from path.to.custom.extension import SimpleJWTTokenUserScheme

...

REST_FRAMEWORK = {
    'DEFAULT_SCHEMA_CLASS': 'drf_spectacular.openapi.AutoSchema',
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'path_to_your_module.JWTAuthentication',
    ),
}