You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flask+Flask-restx应用用flask run无法打开Swagger页面求助

问题根源分析

你的问题出在两个核心点上:

  1. 初始化逻辑仅在python app.py启动时执行:你的initialize_app(app)被放在main()函数里,只有当脚本作为主程序运行(__name__ == "__main__")时才会触发main()。但用flask run启动时,Flask CLI是直接导入你的app对象,不会执行main(),导致API蓝图、Swagger相关的初始化完全没运行,自然访问不到Swagger页面。
  2. 端口配置不匹配:你的FLASK_SERVER_NAME硬编码成了localhost:8888,但flask run默认启动在非8888端口(你这里是6000),这会导致Swagger的路由生成与实际运行端口冲突。

解决方案

1. 把初始化逻辑移到全局范围

修改app.py,将initialize_app(app)从main()中移出,放在全局代码区域,确保任何启动方式都会执行初始化:

import logging.config
import os
from flask import Flask, Blueprint
from flask_cors import CORS
from werkzeug.middleware.proxy_fix import ProxyFix
from src.config import default
from src.api.controllers.endpoints.users import ns as users_namespace
from src.api.controllers.endpoints.statuses import ns as status_namespace
from src.api import api
from src.database import db

app = Flask(__name__)
CORS(app)
app.wsgi_app = ProxyFix(app.wsgi_app)

logging_conf_path = os.path.normpath(os.path.join(os.path.dirname(__file__), '../logging.conf'))
logging.config.fileConfig(logging_conf_path)
log = logging.getLogger(__name__)

def configure_app(flask_app):
    flask_app.config['SERVER_NAME'] = default.FLASK_SERVER_NAME
    flask_app.config['SQLALCHEMY_DATABASE_URI'] = default.SQLALCHEMY_DATABASE_URI
    flask_app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = default.SQLALCHEMY_TRACK_MODIFICATIONS
    flask_app.config['SWAGGER_UI_DOC_EXPANSION'] = default.RESTPLUS_SWAGGER_UI_DOC_EXPANSION
    flask_app.config['RESTPLUS_VALIDATE'] = default.RESTPLUS_VALIDATE
    flask_app.config['RESTPLUS_MASK_SWAGGER'] = default.RESTPLUS_MASK_SWAGGER
    flask_app.config['ERROR_404_HELP'] = default.RESTPLUS_ERROR_404_HELP

def initialize_app(flask_app):
    configure_app(flask_app)
    blueprint = Blueprint('CovidAPI', __name__, url_prefix='/')
    api.init_app(blueprint)
    api.add_namespace(users_namespace)
    api.add_namespace(status_namespace)
    flask_app.register_blueprint(blueprint)
    db.init_app(flask_app)

# 全局执行初始化,确保所有启动方式都能加载API和Swagger
initialize_app(app)

def main():
    log.info('>>>>> Starting development server at http://{}/ <<<<<'.format(app.config['SERVER_NAME']))
    app.run(debug=default.FLASK_DEBUG)

if __name__ == "__main__":
    main()

2. 解决端口不匹配问题

有两种可选方式:

方式A:修改配置文件,移除硬编码端口

编辑src/config/default.py,把FLASK_SERVER_NAME改成:

FLASK_SERVER_NAME = 'localhost'

这样Swagger会自动适配当前运行的端口,无需固定端口号。

方式B:启动时指定匹配配置的端口

如果不想修改配置,启动时直接指定8888端口:

set FLASK_APP=app.py
flask run --port 8888

验证修改

完成修改后,用flask run(或指定端口)启动服务,访问http://localhost:<你的端口>/swagger-ui/(Flask-RESTX默认的Swagger路径),就能正常打开Swagger页面了。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 13:12:39