Flask(十二)部署与安全性【完】

在完成 Flask 应用的开发后,我们需要将其部署到生产环境保障安全性。本章将涵盖:

  • 如何部署 Flask 应用
  • 使用 WSGI 服务器
  • Nginx 反向代理
  • 使用 Docker 部署
  • HTTPS 配置
  • 常见安全风险及防护措施

12.1 Flask 部署方式概览

Flask 运行在 开发服务器 上,但生产环境推荐使用更稳定的 WSGI 服务器,如:

  • Gunicorn(适用于 Linux)
  • uWSGI(适用于高性能需求)
  • Docker 部署
  • 云服务(如 AWS, GCP, 阿里云等)

12.2 使用 Gunicorn 部署 Flask

Gunicorn 是一个高性能的 WSGI 服务器,适用于生产环境。

12.2.1 安装 Gunicorn

pip install gunicorn

12.2.2 启动 Flask 应用

gunicorn -w 4 -b 0.0.0.0:8000 app:app

  • -w 4:使用 4 个 worker 进程
  • -b 0.0.0.0:8000:监听所有 IP 的 8000 端口

12.2.3 配置 Systemd 让 Flask 后台运行

在 /etc/systemd/system/flask.service 创建以下内容:

[Unit]
Description=Gunicorn instance to serve Flask appAfter=network.target

[Service]
User=www-dataGroup=www-dataWorkingDirectory=/home/ubuntu/myflaskappExecStart=/usr/local/bin/gunicorn -w 4 -b 0.0.0.0:8000 app:app

[Install]
WantedBy=multi-user.target

启动 Flask:

sudo systemctl start flask

sudo systemctl enable flask

12.3 Nginx 反向代理

使用 Nginx 将流量转发到 Gunicorn,提高 Flask 访问速度。

12.3.1 安装 Nginx

sudo apt update

sudo apt install nginx

12.3.2 配置 Nginx

在 /etc/nginx/sites-available/flask 添加:

server {
    listen 80;

    server_name example.com;

    location / {
        proxy_pass http://127.0.0.1:8000;

        proxy_set_header Host $host;

        proxy_set_header X-Real-IP $remote_addr;
    }
}

激活配置:

sudo ln -s /etc/nginx/sites-available/flask /etc/nginx/sites-enabled

sudo systemctl restart nginx

12.4 使用 Docker 部署 Flask

Docker 可以封装 Flask 及其所有依赖,使部署更便捷。

12.4.1 创建 Dockerfile

FROM python:3.9

WORKDIR /app

COPY . /app

RUN pip install -r requirements.txt

CMD ["gunicorn", "-w", "4", "-b", "0.0.0.0:8000", "app:app"]

12.4.2 构建和运行容器

docker build -t myflaskapp .

docker run -d -p 8000:8000 myflaskapp

12.5 配置 HTTPS

为了确保安全,推荐使用 Let's Encrypt 配置 HTTPS。

12.5.1 安装 Certbot

sudo apt install certbot python3-certbot-nginx

12.5.2 生成 SSL 证书

sudo certbot --nginx -d example.com

12.6 Flask 安全防护

Flask 内置多个安全机制,但仍需额外防护以下攻击:

  • SQL 注入
  • XSS(跨站脚本攻击)
  • CSRF(跨站请求伪造)
  • Cookie 安全

12.6.1 防止 SQL 注入

Flask-SQLAlchemy 使用参数化查询,避免 SQL 注入:

user = User.query.filter_by(username=request.args.get('username')).first()

12.6.2 防止 XSS

Flask 默认转义 HTML,避免 XSS 攻击:

{{ user_input }}

如果确实需要渲染 HTML,需要 safe 过滤:

{{ user_input | safe }}

12.6.3 防止 CSRF

使用 Flask-WTF 保护表单:

pip install flask-wtf

在 config.py 配置 CSRF 保护:

SECRET_KEY = 'your-secret-key'

WTF_CSRF_ENABLED = True

表单示例:

from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField
from wtforms.validators import DataRequired

class NameForm(FlaskForm):
    name = StringField('Name', validators=[DataRequired()])

    submit = SubmitField('Submit')

12.6.4 保护 Cookie

使用 secure 和 HttpOnly 选项:

app.config['SESSION_COOKIE_SECURE'] = True  # 仅允许 HTTPS

app.config['SESSION_COOKIE_HTTPONLY'] = True  # 仅允许服务器访问

app.config['SESSION_COOKIE_SAMESITE'] = 'Lax'  # 防止 CSRF

12.7 结语

本章介绍了 Flask 的生产环境部署 及 安全防护措施,确保应用稳定运行。在实际项目中,推荐结合 Docker、Gunicorn、Nginx、HTTPS,并加强安全防护,防止 SQL 注入、XSS 和 CSRF 攻击。

至此,Flask系列已完整覆盖 Flask 的各项功能与实战技巧,希望与各位优秀码农的一起进步!

欢迎留言讨论

【完】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值