AWS Lambda部署Flasgger时apispec路径多出$default段问题
问题根因
- 部署时使用的是AWS API Gateway V2(HTTP API)默认的
$default阶段,serverless-wsgi插件转发请求时,会默认把阶段路径/$default写入WSGI协议的SCRIPT_NAME环境变量 - Flasgger生成OpenAPI规范文件的访问地址时,会自动拼接
SCRIPT_NAME作为路径前缀,最终生成了带/$default的错误地址。而API Gateway的$default阶段本身不需要在请求路径中携带阶段段,这也是手动删掉路径里的$default后接口可以正常访问的原因
修复方案
二选一即可,优先选方案1,对基础设施配置无侵入:
方案1:调整Flasgger配置,跳过SCRIPT_NAME自动拼接
直接修改swagger配置,强制指定spec和静态资源的路径前缀为空,不自动拼接阶段路径,修改后的完整配置如下:
swagger_config = { "headers": [], "specs": [ { "endpoint": 'apispec', "route": '/apispec.json', # 强制spec路径不拼接SCRIPT_NAME前缀 "url_prefix": "", "rule_filter": lambda rule: True, "model_filter": lambda tag: True, } ], "static_url_path": "/flasgger_static", # 同步配置静态资源前缀为空,避免Swagger UI的JS/CSS资源路径也异常 "swagger_ui_static_url_prefix": "", "swagger_ui": True, "specs_route": "/cms-api" } # 原有初始化逻辑保持不变 swagger_config['swagger_ui_bundle_js'] = '//unpkg.com/swagger-ui-dist@3/swagger-ui-bundle.js' swagger_config['swagger_ui_standalone_preset_js'] = '//unpkg.com/swagger-ui-dist@3/swagger-ui-standalone-preset.js' swagger_config['jquery_js'] = '//unpkg.com/jquery@2.2.4/dist/jquery.min.js' swagger_config['swagger_ui_css'] = '//unpkg.com/swagger-ui-dist@3/swagger-ui.css' Swagger(app, config=swagger_config, template=template)
修改完成后重新部署服务即可生效。
方案2:调整serverless-wsgi配置,剥离阶段路径
如果不想修改应用侧代码,可以在serverless.yml中修改wsgi插件配置,让插件转发请求前自动剥离阶段路径,不向应用传递SCRIPT_NAME:
custom: wsgi: app: src.__init__.app # 开启阶段路径剥离,移除传给应用的/$default前缀 strip_stage: true
修改后重新执行serverless deploy部署即可。
验证方法
部署完成后访问/cms-api文档地址,打开浏览器开发者工具查看网络请求:
- 确认
apispec.json的请求地址不包含/$default段 - 确认接口返回200状态码,Swagger UI可以正常加载所有接口定义
提示:如果后续给HTTP API绑定自定义域名,上述两种配置都不需要额外调整,路径可以自动适配。
内容的提问来源于stack exchange,提问作者Aldous S.
相关产品推荐
相关产品推荐

