You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Flasgger/Swagger apidocs本地正常访问但OpenShift部署后无法加载(提示需启用JavaScript)问题排查

Flask + Flasgger在OpenShift部署后Swagger UI无法加载的问题排查与解决

我来帮你分析这个问题——你遇到的情况其实是典型的静态资源路由不匹配导致的,本地正常但部署后失效的差异点就在Traefik的路由规则覆盖范围上。

先再明确下问题现象:

  • 本地:/apidocs能完整加载Swagger UI,/api_documentation.json正常返回
  • OpenShift:/apidocs只显示"Powered by Flasgger 0.9.5",swagger-ui-bundle.js返回"You need to enable JavaScript to run this app.",但/api_documentation.json依旧正常

核心原因分析

Flasgger渲染的Swagger UI页面,会从根路径请求静态资源(比如/swagger-ui-bundle.js/swagger-ui.css),但你的Traefik配置只路由了/apidocs/api_documentation.json这两个路径。当浏览器在OpenShift环境下请求这些静态资源时,Traefik没有把它们转发到你的Flask服务器,而是返回了某个默认页面(比如Istio/Traefik的通用提示页),导致UI无法渲染。

本地环境下,Flask的内置服务器会自动处理这些根路径的静态资源请求,所以一切正常;但在OpenShift的反向代理架构下,必须显式配置路由规则覆盖这些路径。

具体解决方案

方案1:扩展Traefik路由规则,覆盖Swagger静态资源

更新Traefik配置,把Swagger UI需要的所有静态资源路径都路由到你的Python服务:

# 原apidocs路由保留
apidocs:
rule: PathPrefix(`/apidocs`)
entryPoints: - web
middlewares: - gzip - mysecurity-no-token
service: my-python-server

# 原JSON路由保留
apidocumentation:
rule: PathPrefix(`/api_documentation.json`)
entryPoints: - web
middlewares: - gzip - mysecurity-no-token
service: my-python-server

# 新增Swagger静态资源路由
swagger-static:
rule: PathPrefix(`/swagger-ui-bundle.js`) || PathPrefix(`/swagger-ui.css`) || PathPrefix(`/swagger-ui-standalone-preset.js`) || PathPrefix(`/favicon-32x32.png`)
entryPoints: - web
middlewares: - gzip - mysecurity-no-token
service: my-python-server

或者用更简洁的正则匹配:

swagger-static:
rule: Path(`/swagger-ui-{file:.*}`) || Path(`/favicon-{size:.*}.png`)
entryPoints: - web
middlewares: - gzip - mysecurity-no-token
service: my-python-server

方案2:修改Flasgger配置,让静态资源使用/apidocs前缀

如果不想修改Traefik配置,可以调整Flasgger的初始化参数,让它的静态资源请求带上/apidocs前缀,这样就能复用现有的PathPrefix(/apidocs)路由规则:

from flasgger import Swagger
from flask import Flask

app = Flask(__name__)
# 配置静态资源路径前缀
swagger = Swagger(
    app,
    static_url_path='/apidocs/static',
    swagger_ui_bundle_js='/apidocs/swagger-ui-bundle.js',
    swagger_ui_css='/apidocs/swagger-ui.css',
    swagger_ui_standalone_preset_js='/apidocs/swagger-ui-standalone-preset.js'
)

方案3:检查Istio Sidecar配置(如果环境使用了Istio)

从请求Header看到你的OpenShift环境用了istio-envoy作为服务器,可能Istio的VirtualService也限制了路由路径。需要确保VirtualService包含所有Swagger相关的路径:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: my-python-server
spec:
  hosts:
  - my-openshift-url-here
  http:
  - match:
    - uri:
        prefix: /apidocs
    - uri:
        prefix: /api_documentation.json
    - uri:
        prefix: /swagger-ui-
    - uri:
        exact: /favicon-32x32.png
    route:
    - destination:
        host: my-python-server
        port:
          number: 5000

验证步骤

  1. 部署修改后的配置(Traefik/Flask/Istio)
  2. 重新访问https://my-openshift-url-here/apidocs,打开Chrome调试工具的Network标签
  3. 检查所有静态资源请求的状态码是否为200,且响应内容是正确的JS/CSS文件
  4. 确认静态资源加载正常后,Swagger UI应该就能完整显示了

内容的提问来源于stack exchange,提问作者mwk

火山引擎 最新活动