Как настроить схемы "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-адресом.

Другие вопросы по тегам