宝塔面板无法直接通过python项目管理器部署flask项目,因其强制依赖wsgi.py和application变量,而标准flask使用app.py和app实例;必须绕过该模块,采用“网站+反向代理+gunicorn/uvicorn+supervisor”手动配置:删nginx冲突端口、反代至127.0.0.1:5000、用绝对路径配置supervisor启动命令(如gunicorn app:app)、nginx接管静态文件并正确设置ssl与proxy_pass规则。

Flask 项目在宝塔面板上“快速部署”不等于点几下就完事——官方所谓“Python项目管理器”对 Flask 的支持是残缺的,直接填 app.py + 端口,大概率启动失败或返回 502。真正能跑通的路径只有一条:**绕过 Python 项目管理器,用网站 + 反向代理 + gunicorn(或 uvicorn)手动搭链路**。
为什么不能直接用“Python项目管理器”部署 Flask
宝塔 v8.0+ 的 Python 项目管理器底层硬编码依赖 wsgi.py 入口、强制识别 application 变量,而标准 Flask 项目通常只有 app.py,里面定义的是 app = Flask(...)。它不会自动帮你做 from app import app 这类导入,也不会处理 if __name__ == '__main__': app.run(...) 这种开发模式启动逻辑。你点“启动”,它其实是在执行一个根本不存在的 WSGI 调用,日志里往往只显示 “No module named 'wsgi'”,连错在哪都看不出。
必须手动配 gunicorn 启动命令(关键参数不能错)
进宝塔「Supervisor 管理器」(需先安装插件),新增进程时注意以下几点:
-
运行目录填项目根路径,比如/www/wwwroot/myflask,不是子目录 -
启动命令别写python app.py,要写:gunicorn -w 2 -b 127.0.0.1:5000 --chdir /www/wwwroot/myflask app:app - 其中
app:app表示:文件名app.py,变量名app;如果你的入口文件叫main.py且实例叫application,就得写main:application - 确保
gunicorn安装在站点对应的 Python 环境里:用宝塔终端进/www/server/python/bin/python -m pip install gunicorn,别用系统默认 pip
Nginx 反向代理配置的三个硬性条件
在「网站」→「反向代理」里添加一条,目标 URL 填 http://127.0.0.1:5000(和 gunicorn 绑定端口一致),同时必须满足:
- 删掉 Nginx 配置文件里自动生成的
listen 8888;这类行——否则端口冲突,反代直接connect refused -
proxy_pass后面不能加斜杠:http://127.0.0.1:5000✅,http://127.0.0.1:5000/❌(后者会导致 Flask 的url_for生成路径多一层 /) - SSL 必须在「网站」→「SSL」里申请并启用;反向代理不会透传 HTTPS,
request.scheme会是 http,除非你在uvicorn启动时加--proxy-headers --forwarded-allow-ips="*"
静态文件 404?Django 有 collectstatic,Flask 得自己管
Flask 默认不提供生产级静态服务,Nginx 必须接管。常见错误是把前端打包后的 dist 目录直接扔进 Flask 项目里,然后指望 send_from_directory 抗压——线上环境立刻崩。
- 正确做法:把 Vue/React 打包后的
dist目录上传到独立路径,比如/www/wwwroot/myflask-frontend - 在 Nginx 配置中加 location 块:
location / { alias /www/wwwroot/myflask-frontend/; }(结尾有/) - 后端 API 路径统一走
/api/...,前端用 axios 请求时 baseURL 设为/api,由 Nginx 把/api反代到 Flask 进程
gunicorn 的 --chdir、Nginx 的 alias、Supervisor 的运行目录、甚至 requirements.txt 里相对路径的依赖——必须全部基于绝对路径,且严格匹配宝塔文件系统的实际位置。少一个字符,就卡在 import error 或 404。











