如何使用drf-yasg自动生成的swagger页面配置“HTTPS”方案?

hrysbysz  于 2022-11-06  发布在  其他
关注(0)|答案(4)|浏览(351)

我知道在一个传统的swagger YAML文件中,我们可以用以下方式定义方案:

schemes:
  - http
  - https

//OR

schemes: [http, https]

但是,如何使用drf-yasg库对自动生成的swagger页面执行同样的操作呢?
现在,生成的swagger页面只包含HTTP方案,但缺少HTTPS。我尝试将setting.py中的DEFAULT_API_URL设置为https://mybaseurl.com,但似乎不起作用。

1l5u6lss

1l5u6lss1#

要在swagger中同时使用 httphttps 方案,您可以从drf_yasg.generators扩展OpenAPISchemaGenerator

class BothHttpAndHttpsSchemaGenerator(OpenAPISchemaGenerator):
    def get_schema(self, request=None, public=False):
        schema = super().get_schema(request, public)
        schema.schemes = ["http", "https"]
        return schema

因此,现在您可以将其用作get_schema_view()generator_class

schema_view = get_schema_view(
    openapi.Info( ... ),
    public=True,
    generator_class=BothHttpAndHttpsSchemaGenerator, # Here
    permission_classes=(AllowAny,)
)
xtupzzrd

xtupzzrd2#

有一个解决办法。
urls.py中定义get_schema_view()时,请使用以下代码:

schema_view = get_schema_view(
    openapi.Info( ... ),
    url='https://example.net/api/v1/', # Important bit
    public=True,
    permission_classes=(permissions.AllowAny,)
)

注意:您可以使用https或http,因为这样可以更好地将此解决方案与环境变量一起用于不同的设置。

sdnqo3pr

sdnqo3pr3#

卖出

url='https://your_server_address/'

在get_schema_view()函数中使用URL。

zbsbpyhn

zbsbpyhn4#

另一种在swagger页面中使用https方案的方法是使用SECURE_PROXY_SSL_HEADER配置。
假设您的Django REST API位于一个执行SSL终止的Nginx之后,您可以让Nginx将X-Forwarded-Proto: https转发到您的Django应用程序(Nginx可能已经默认转发了这个头,这取决于你的设置)通过下面的配置,你的Django应用程序会意识到它是在一个SSL终止的Nginx后面,而Django的内部函数is_secure()会在头文件存在时返回True
一旦is_secure()返回True,swagger页面方案将自动变为https

SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')

我喜欢这种方法,因为它不需要任何硬编码url,甚至不需要从环境变量中配置url。此外,is_secure()函数也在其他地方内部使用,所以希望让该函数按照它理想的方式工作。

相关问题