Flask 部署
开发完成后,需要将 Flask 应用部署到生产环境,让真实用户能够访问。
本章介绍从开发到生产的关键步骤和注意事项。
开发服务器 vs 生产服务器
重要:Flask 内置的开发服务器(flask run)仅适用于开发环境。它不具备生产环境所需的安全性、稳定性和性能。生产环境必须使用专业的 WSGI 服务器。
| 特性 | Flask 开发服务器 | 生产 WSGI 服务器(Gunicorn/Waitress) |
|---|---|---|
| 并发处理 | 单线程(默认) | 多进程/多线程/协程 |
| 安全性 | Debug 模式可在浏览器执行代码 | 无调试功能,安全可控 |
| 性能 | 未经优化 | 针对高并发优化 |
| 适用场景 | 本地开发、调试 | 线上生产环境 |
部署检查清单
在部署之前,确保以下事项都已完成:
实例
# 文件路径:app.py(生产环境相关配置检查)
import os
app.config.update(
# 1. 关闭 Debug 模式(必须!)
DEBUG=False,
# 2. 从环境变量读取密钥(永远不要硬编码)
SECRET_KEY=os.environ.get("FLASK_SECRET_KEY", ""),
# 3. 配置 Session Cookie 安全选项
SESSION_COOKIE_SECURE=True, # 仅通过 HTTPS 传输
SESSION_COOKIE_HTTPONLY=True, # 禁止 JavaScript 访问
SESSION_COOKIE_SAMESITE="Lax", # 防止 CSRF 攻击
)
import os
app.config.update(
# 1. 关闭 Debug 模式(必须!)
DEBUG=False,
# 2. 从环境变量读取密钥(永远不要硬编码)
SECRET_KEY=os.environ.get("FLASK_SECRET_KEY", ""),
# 3. 配置 Session Cookie 安全选项
SESSION_COOKIE_SECURE=True, # 仅通过 HTTPS 传输
SESSION_COOKIE_HTTPONLY=True, # 禁止 JavaScript 访问
SESSION_COOKIE_SAMESITE="Lax", # 防止 CSRF 攻击
)
完整检查清单:
| 检查项 | 说明 | 风险等级 |
|---|---|---|
| DEBUG = False | 关闭调试模式,防止代码泄露 | 严重 |
| SECRET_KEY 随机且保密 | Session 和 flash 依赖密钥签名 | 严重 |
| SECRET_KEY 从环境变量读取 | 不硬编码,不提交到 Git | 严重 |
| 数据库密码从环境变量读取 | 敏感信息不入代码 | 严重 |
| SESSION_COOKIE_SECURE = True | HTTPS 下才发送 Cookie | 高 |
| 错误页面不暴露堆栈信息 | 使用自定义 errorhandler | 中 |
使用 Waitress 部署(Windows/macOS/Linux)
Waitress 是一个纯 Python WSGI 服务器,跨平台,安装简单:
(.venv) $ pip install waitress
实例
# 文件路径:run.py(生产环境启动脚本)
from waitress import serve
from app import create_app
app = create_app()
if __name__ == "__main__":
# 启动生产服务器
serve(app, host="0.0.0.0", port=8000, threads=4)
# host="0.0.0.0" 允许外部访问
# threads=4 使用 4 个线程处理并发请求
from waitress import serve
from app import create_app
app = create_app()
if __name__ == "__main__":
# 启动生产服务器
serve(app, host="0.0.0.0", port=8000, threads=4)
# host="0.0.0.0" 允许外部访问
# threads=4 使用 4 个线程处理并发请求
启动:
(.venv) $ python run.py Serving on http://0.0.0.0:8000
使用 Gunicorn 部署(Linux/macOS)
Gunicorn 是 Linux 环境下最流行的 Python WSGI 服务器,性能优秀:
(.venv) $ pip install gunicorn
启动 Gunicorn(直接在命令行指定应用):
# 基本用法:4 个 worker 进程 $ gunicorn -w 4 -b 0.0.0.0:8000 "app:create_app()" # 参数说明: # -w 4 : 启动 4 个 worker 进程(通常设为 CPU 核心数 × 2 + 1) # -b 0.0.0.0:8000 : 监听所有网络接口的 8000 端口 # "app:create_app()" : 模块名:工厂函数(与 flask --app 语法相同)
Gunicorn worker 类型选择:
| Worker 类型 | 适用场景 | 命令 |
|---|---|---|
| sync(默认) | CPU 密集型、低并发 | gunicorn -w 4 app:app |
| gevent | IO 密集型、高并发长连接 | gunicorn -k gevent -w 4 app:app |
| gthread | 中等并发、需要线程支持 | gunicorn --threads=2 -w 4 app:app |
Gunicorn 不支持 Windows。如果你在 Windows 上部署,请使用 Waitress。
使用 Nginx 反向代理
在生产环境中,通常用 Nginx 作为反向代理放在 WSGI 服务器前面:
- Nginx 处理静态文件(CSS、JS、图片),效率远高于 Python
- Nginx 提供 HTTPS 终端(SSL 终结)
- Nginx 做负载均衡,分发请求到多个后端 worker
一个最小化的 Nginx 配置示例:
实例
# 文件路径:/etc/nginx/sites-available/runoob
server {
listen 80;
server_name runoob.com www.runoob.com;
# 静态文件由 Nginx 直接处理
location /static/ {
alias /var/www/runoob/static/;
expires 30d; # 浏览器缓存 30 天
}
# 其他请求转发给 Gunicorn
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
server {
listen 80;
server_name runoob.com www.runoob.com;
# 静态文件由 Nginx 直接处理
location /static/ {
alias /var/www/runoob/static/;
expires 30d; # 浏览器缓存 30 天
}
# 其他请求转发给 Gunicorn
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
启用配置并重载 Nginx:
$ sudo ln -s /etc/nginx/sites-available/runoob /etc/nginx/sites-enabled/ $ sudo nginx -t # 检查配置语法 $ sudo systemctl reload nginx
使用 systemd 管理服务(Linux)
创建 systemd 服务文件,让 Flask 应用开机自启并在崩溃后自动重启:
实例
# 文件路径:/etc/systemd/system/runoob.service
[Unit]
Description=RUNOOB Flask Application
After=network.target
[Service]
User=www-data
WorkingDirectory=/var/www/runoob
# 启动时自动加载 .env 文件中的环境变量
EnvironmentFile=-/var/www/runoob/.env
# 使用 Gunicorn 启动应用
ExecStart=/var/www/runoob/.venv/bin/gunicorn -w 4 -b 127.0.0.1:8000 "app:create_app()"
# 崩溃后自动重启
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
[Unit]
Description=RUNOOB Flask Application
After=network.target
[Service]
User=www-data
WorkingDirectory=/var/www/runoob
# 启动时自动加载 .env 文件中的环境变量
EnvironmentFile=-/var/www/runoob/.env
# 使用 Gunicorn 启动应用
ExecStart=/var/www/runoob/.venv/bin/gunicorn -w 4 -b 127.0.0.1:8000 "app:create_app()"
# 崩溃后自动重启
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
启动和管理服务:
$ sudo systemctl daemon-reload # 重载配置文件 $ sudo systemctl enable runoob # 设置开机自启 $ sudo systemctl start runoob # 启动服务 $ sudo systemctl status runoob # 查看服务状态 $ sudo journalctl -u runoob -f # 实时查看日志
WSGI 服务器速查
| 服务器 | 平台 | 特点 | 安装 |
|---|---|---|---|
| Werkzeug(内置) | 全平台 | 仅开发用,支持热重载和调试器 | 随 Flask 自带 |
| Waitress | 全平台 | 纯 Python,Windows 首选 | pip install waitress |
| Gunicorn | Linux/macOS | 性能好,Linux 首选,生态成熟 | pip install gunicorn |
| uWSGI | Linux/macOS | 功能全面,配置较复杂 | pip install uwsgi |
教程总结
恭喜你完成了 Flask 入门教程的全部内容!
回顾一下你学到的知识:
| 章节 | 核心技能 |
|---|---|
| 认识 Flask | 理解 Flask 的定位和生态 |
| 环境准备 | 创建虚拟环境,安装依赖 |
| 第一个应用 | 创建最小应用,使用 flask run |
| 路由系统 | URL 映射、变量规则、url_for、HTTP 方法 |
| 请求与响应 | 读取请求数据,构造各种类型响应 |
| 模板渲染 | Jinja2 语法、模板继承、XSS 防护 |
| 静态文件 | 管理 CSS/JS/图片等静态资源 |
| Session 与 Cookie | 用户状态保持、Flash 消息 |
| 配置管理 | 多环境配置,环境变量加载 |
| Blueprint 蓝图 | 模块化组织代码,工厂模式 |
| 错误处理 | 自定义错误页面,日志记录 |
| 数据库集成 | SQLite 操作,g 对象管理连接 |
| 测试 | test_client、pytest 测试路由和 API |
| 部署 | Gunicorn/Waitress + Nginx + systemd |
继续学习的推荐方向:
- Flask-SQLAlchemy:功能更强大的数据库集成
- Flask-Login:用户认证和权限管理
- Flask-WTF:表单处理和 CSRF 保护
- Flask-Migrate:数据库迁移管理
- Flask-RESTful 或 Flask-RESTX:构建 RESTful API
- Docker 容器化部署,进一步提升可移植性
