我知道在一个传统的swagger YAML文件中,我们可以用以下方式定义方案:
schemes: - http - https //OR schemes: [http, https]
但是,如何使用drf-yasg库对自动生成的swagger页面执行同样的操作呢?现在,生成的swagger页面只包含HTTP方案,但缺少HTTPS。我尝试将setting.py中的DEFAULT_API_URL设置为https://mybaseurl.com,但似乎不起作用。
drf-yasg
HTTP
HTTPS
setting.py
DEFAULT_API_URL
https://mybaseurl.com
1l5u6lss1#
要在swagger中同时使用 http 和 https 方案,您可以从drf_yasg.generators扩展OpenAPISchemaGenerator。
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
get_schema_view()
generator_class
schema_view = get_schema_view( openapi.Info( ... ), public=True, generator_class=BothHttpAndHttpsSchemaGenerator, # Here permission_classes=(AllowAny,) )
xtupzzrd2#
有一个解决办法。在urls.py中定义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,因为这样可以更好地将此解决方案与环境变量一起用于不同的设置。
sdnqo3pr3#
卖出
url='https://your_server_address/'
在get_schema_view()函数中使用URL。
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。
https
SECURE_PROXY_SSL_HEADER
X-Forwarded-Proto: https
is_secure()
True
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
我喜欢这种方法,因为它不需要任何硬编码url,甚至不需要从环境变量中配置url。此外,is_secure()函数也在其他地方内部使用,所以希望让该函数按照它理想的方式工作。
4条答案
按热度按时间1l5u6lss1#
要在swagger中同时使用 http 和 https 方案,您可以从
drf_yasg.generators
扩展OpenAPISchemaGenerator
。因此,现在您可以将其用作
get_schema_view()
的generator_class
xtupzzrd2#
有一个解决办法。
在
urls.py
中定义get_schema_view()时,请使用以下代码:注意:您可以使用https或http,因为这样可以更好地将此解决方案与环境变量一起用于不同的设置。
sdnqo3pr3#
卖出
在get_schema_view()函数中使用URL。
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
。我喜欢这种方法,因为它不需要任何硬编码url,甚至不需要从环境变量中配置url。此外,
is_secure()
函数也在其他地方内部使用,所以希望让该函数按照它理想的方式工作。