现在位置: 首页 > Flask 教程 > 正文

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 攻击
)

完整检查清单:

检查项 说明 风险等级
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 个线程处理并发请求

启动:

(.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

Flask 生产环境部署架构

一个最小化的 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;
    }
}

启用配置并重载 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

启动和管理服务:

$ 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-RESTfulFlask-RESTX:构建 RESTful API
  • Docker 容器化部署,进一步提升可移植性