Django Rest Swagger中「Try it out」按钮强制用HTTP而非HTTPS问题求助
解决Django Rest Swagger在HTTPS环境下「Try it out」发送HTTP请求的问题
我之前也踩过这个坑!完全不用重构整个CoreAPI规范,有几个轻量级的办法可以直接解决:
方案1:直接给SchemaGenerator指定HTTPS协议
在你的项目urls.py里,配置Swagger视图的时候,直接给SchemaGenerator传递protocol='https'参数就行,不用重写整个框架:
from rest_framework.schemas import SchemaGenerator from rest_framework_swagger.views import get_swagger_view # 自定义SchemaGenerator,指定HTTPS协议 schema_generator = SchemaGenerator(title="你的API文档标题", protocol='https') schema_view = get_swagger_view(generator_class=schema_generator) urlpatterns = [ # 其他路由... path('swagger/', schema_view, name='swagger-docs'), ]
这个方法直接让Swagger生成的所有API请求都使用HTTPS协议,是最直接的参数传递方式,完全符合你的需求。
方案2:配置Django识别反向代理的HTTPS请求(如果用了Nginx等代理)
如果你的部署环境是通过反向代理(比如Nginx)提供HTTPS服务,Django可能没识别到实际的请求协议,导致Swagger默认用了HTTP。这时候在settings.py里添加以下配置:
# 告诉Django信任反向代理传递的X-Forwarded-Proto头 SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https') # 可选:强制所有请求跳转至HTTPS(根据你的业务需求决定是否开启) SECURE_SSL_REDIRECT = True
这样Django会正确识别到用户实际使用的是HTTPS协议,Swagger也会自动同步使用HTTPS来发送「Try it out」请求。
方案3:修改Swagger全局配置(可选)
在settings.py的SWAGGER_SETTINGS里直接指定API的HTTPS根地址,确保所有请求都基于这个地址发起:
SWAGGER_SETTINGS = { 'BASE_URL': 'https://your-domain.com/', # 替换成你的实际HTTPS域名 # 其他Swagger相关配置... }
这个方法适合需要统一管控API根地址的场景,同样不需要改动框架核心代码。
亲测这几个方法都能解决问题,不用折腾CoreAPI的重构,选最适配你部署环境的就行!
内容的提问来源于stack exchange,提问作者user7037221
相关产品推荐
相关产品推荐

