应优先显式指定非默认端口(如5001)启动flask应用,避免端口冲突;若必须释放5000端口,则用sudo lsof -i :5000查pid后执行kill -9 终止占用进程。

Flask应用启动时端口被占用怎么办
直接运行 flask run 默认走 5000 端口,如果提示 OSError: [Errno 48] Address already in use,说明该端口正被其他进程占用。别急着杀进程,先确认是否真需要换端口——比如你在开发多个 Flask 项目,或本地已跑着另一个 Web 服务。
最稳妥的做法是显式指定端口,而不是依赖默认值。这样既避免冲突,也方便团队协作时统一配置。
- 用命令行启动时加
--port参数:flask run --port 5001 - 在代码中调用
app.run()时传参:app.run(port=5001) - 通过环境变量控制(推荐用于不同环境):
export FLASK_RUN_PORT=5001,再执行flask run
为什么 app.run() 在生产环境不能用
Flask 自带的开发服务器(Werkzeug)只适合调试,不支持并发、无超时控制、不处理静态文件缓存,更关键的是它默认开启调试模式(debug=True)会暴露代码路径和交互式调试器——线上一旦开启等于裸奔。
你看到的很多教程里写 if __name__ == '__main__': app.run(),这只是为了快速验证路由逻辑,千万别把它留在生产部署脚本里。
-
app.run()启动后会阻塞主线程,无法配合 gunicorn/uWSGI 等 WSGI 服务器使用 - 即使设了
debug=False,底层仍是单线程,高并发下响应延迟剧烈 - Windows 下若用了
reload=True(默认开启),可能触发多次初始化,导致数据库连接重复建立等问题
如何让 Flask 应用监听所有网络接口
默认 flask run 只绑定 127.0.0.1,本机能访问,但局域网其他设备(比如手机调试、同事连你 IP 测试)打不开。这不是端口问题,是 host 绑定限制。
要让外部设备访问,必须把 host 改成 0.0.0.0,同时确保防火墙放行对应端口(macOS/Linux 一般不用额外操作,Windows 需检查“Windows Defender 防火墙”入站规则)。
- 命令行方式:
flask run --host 0.0.0.0 --port 5000 - 代码中:
app.run(host='0.0.0.0', port=5000) - 环境变量方式:
export FLASK_RUN_HOST=0.0.0.0+export FLASK_RUN_PORT=5000
注意:不要在生产环境开放 0.0.0.0 并启用 debug=True,这会让调试器暴露在公网,极易被利用。
用 Gunicorn 启动时怎么改端口
当项目准备上线,你会用 gunicorn 替代 flask run。它的端口控制逻辑完全不同——不是 Flask 应用自己决定,而是由 Gunicorn 的 worker 进程监听地址决定。
Gunicorn 不读取 app.run() 的参数,也不认 FLASK_RUN_PORT,所有配置都得交给它自己。
- 基本命令:
gunicorn -w 2 -b :8000 myapp:app(-b :8000表示监听所有接口的 8000 端口) - 绑定特定 IP:
-b 127.0.0.1:8000或-b 192.168.1.100:8000 - Unix socket 方式(更安全高效):
-b unix:/tmp/myapp.sock,此时端口概念不存在,需配合 Nginx 反向代理 - 务必加
--preload参数,否则每个 worker 会单独导入一次应用,可能引发数据库连接泄漏等问题
端口冲突在这里表现形式不同:Gunicorn 报错通常是 Address already in use,但来源是它自己尝试 bind 失败,和 Flask 开发服务器无关。排查时先 lsof -i :8000(macOS/Linux)或 netstat -ano | findstr :8000(Windows)看谁占着。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











