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',
),
}