Как настроить схемы "HTTPS" с помощью автоматически генерируемой страницы сваггера drf-yasg?
Я знаю, что в традиционном файле swamger YAML мы можем определить схемы с помощью:
schemes:
- http
- https
//OR
schemes: [http, https]
Однако, как я могу сделать то же самое с автоматически сгенерированной страницей drf-yasg
библиотека? Теперь сгенерированная чванливая страница содержит только HTTP
схемы, но HTTPS
пропал, отсутствует. Я пытался установить DEFAULT_API_URL
в setting.py
в https://mybaseurl.com
, но, кажется, не работает.
Спасибо!
4 ответа
Чтобы использовать схемы http и https в swagger, вы можете расширить
OpenAPISchemaGenerator
из
drf_yasg.generators
.
class BothHttpAndHttpsSchemaGenerator(OpenAPISchemaGenerator):
def get_schema(self, request=None, public=False):
schema = super().get_schema(request, public)
schema.schemes = ["http", "https"]
return schema
Итак, теперь вы можете использовать его как
generator_class
для
get_schema_view()
schema_view = get_schema_view(
openapi.Info( ... ),
public=True,
generator_class=BothHttpAndHttpsSchemaGenerator, # Here
permission_classes=(AllowAny,)
)
Есть решение
При определении get_schema_view() в urls.py
используйте этот код:
schema_view = get_schema_view(
openapi.Info( ... ),
url='https://example.net/api/v1/', # important bit
public=True,
permission_classes=(permissions.AllowAny,)
)
Примечание: вы можете использовать https или http, потому что лучше использовать это решение с переменной env для разных настроек.
Другой способ иметь схему на странице swagger - использоватьSECURE_PROXY_SSL_HEADER
конфигурация.
Предполагая, что ваш Django REST API находится за Nginx , выполняющим завершение SSL, вы можете разрешить Nginx пересылатьX-Forwarded-Proto: https
в ваше приложение Django (Nginx может уже пересылать этот заголовок по умолчанию, в зависимости от того, как вы все настроили). С приведенной ниже конфигурацией ваше приложение Django поймет, что оно находится за SSL, завершающим Nginx, и внутренняя функция Django вернется, когда появится заголовок. См. Настройки Django SSL .
После возвращенияTrue
, схема страницы swagger автоматически превратится вhttps
.
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
Мне нравится этот подход, так как он не требует жесткого кодирования URL-адреса или даже настройки URL-адреса из переменных среды. Кроме того,is_secure()
функция используется внутренне и в другом месте, поэтому желательно, чтобы функция работала так, как в идеале.
Положить
url='https://your_server_address/'
в функции get_schema_view() с URL-адресом.