【11天从零基础入门flask】第 7 章 表单

第 7 章 表单

Cross-Site Request Forgery(CSRF)是指恶意网站通过伪造用户请求来执行不当操作,像是删除数据或执行其他修改操作。在我们的删除条目操作中,虽然使用了 POST 请求来避免使用 GET 请求执行敏感操作,但这个方法并不安全,因为一个恶意站点仍然可以模拟 POST 请求。因此,推荐使用 CSRF 防护机制。

如何在 Flask 中启用 CSRF 防护

Flask-WTF 提供了 CSRF 保护,可以自动生成 CSRF 令牌,并验证该令牌,以确保请求来源是合法的。要启用 CSRF 防护,你需要安装 Flask-WTF:

bash 复制代码
pip install Flask-WTF

然后在 app.py 中启用 CSRF 防护:

python 复制代码
from flask_wtf.csrf import CSRFProtect

# 实例化 CSRF 防护
csrf = CSRFProtect(app)

# 确保所有 POST 请求都需要 CSRF 验证

Flask-WTF 会在每个 POST 请求中自动验证请求中的 CSRF 令牌。通过这种方法,我们可以确保提交的表单仅来自我们的应用,而不是恶意网站。

7.9 使用 Flask-WTF 简化表单处理

虽然我们已经通过手动处理表单数据来实现了表单提交的功能,但当应用变得更复杂时,手动管理表单数据和验证可能会变得冗长且易出错。在这种情况下,使用 Flask-WTF 可以帮助我们简化表单管理和验证。

1. 安装 Flask-WTF

首先,安装 Flask-WTF 扩展:

bash 复制代码
pip install flask-wtf
2. 创建一个表单类

Flask-WTF 让你能够通过创建 Python 类来定义表单,表单中的每个字段都被定义为类的属性。以下是一个简单的表单类:

python 复制代码
from flask_wtf import FlaskForm
from wtforms import StringField
from wtforms.validators import DataRequired, Length

class MovieForm(FlaskForm):
    title = StringField('Title', validators=[DataRequired(), Length(max=60)])
    year = StringField('Year', validators=[DataRequired(), Length(min=4, max=4)])

在这个类中,MovieForm 定义了两个字段:titleyear。每个字段都带有一些验证规则,例如 DataRequired 确保该字段不为空,Length 确保字段长度符合要求。

3. 在视图中使用表单

在视图函数中,我们将 Flask-WTF 表单类作为实例传入模板。示例如下:

python 复制代码
from flask import render_template, redirect, url_for, flash
from app import app, db
from .forms import MovieForm
from .models import Movie

@app.route('/', methods=['GET', 'POST'])
def index():
    form = MovieForm()

    if form.validate_on_submit():
        title = form.title.data
        year = form.year.data

        movie = Movie(title=title, year=year)
        db.session.add(movie)
        db.session.commit()

        flash('Item created.')
        return redirect(url_for('index'))

    movies = Movie.query.all()
    return render_template('index.html', form=form, movies=movies)

在这里,我们实例化了一个 MovieForm 对象 form,并通过 form.validate_on_submit() 来检查表单是否有效。如果表单提交且验证通过,数据将会被存储到数据库中。

4. 在模板中渲染表单

Flask-WTF 提供了一个方便的 form 对象,用来在模板中渲染表单。你可以像这样在 index.html 中渲染表单:

html 复制代码
<form method="post">
    {{ form.hidden_tag() }}  <!-- 隐藏 CSRF 令牌 -->
    <div>
        {{ form.title.label }} {{ form.title() }}
        {% for error in form.title.errors %}
            <div class="error">{{ error }}</div>
        {% endfor %}
    </div>
    <div>
        {{ form.year.label }} {{ form.year() }}
        {% for error in form.year.errors %}
            <div class="error">{{ error }}</div>
        {% endfor %}
    </div>
    <input class="btn" type="submit" value="Add">
</form>

在模板中,我们使用 form.hidden_tag() 渲染隐藏的 CSRF 令牌。然后,通过 form.title.labelform.title() 渲染表单字段和对应的标签。错误消息也会根据表单字段的验证规则自动显示。

7.10 小结

在本章中,我们学习了如何通过 Flask 表单处理数据,包括创建、编辑和删除条目。我们掌握了如何从模板收集用户输入的数据,如何在视图中处理这些数据,并进行必要的验证。通过 Flask-WTF 扩展,我们能够简化表单的创建、验证和渲染,并实现 CSRF 防护。

进阶提示

  • 表单验证:如果你的应用更复杂,使用 Flask-WTF 可以帮助你自动验证表单数据,避免重复的验证代码。
  • 使用 JavaScript 增强体验:可以在前端使用 JavaScript 验证表单数据并进行动态更新,而不需要每次提交表单后才得到结果。
  • 多文件上传:Flask-WTF 支持文件上传功能,可以方便地处理文件类型的表单字段。
相关推荐
菜包eo25 分钟前
二维码驱动的独立站视频集成方案
网络·python·音视频
guojl27 分钟前
营销画像客群架构
后端
Yo_Becky31 分钟前
【PyTorch】PyTorch预训练模型缓存位置迁移,也可拓展应用于其他文件的迁移
人工智能·pytorch·经验分享·笔记·python·程序人生·其他
为神敬酒者35 分钟前
从银行转账实践理解互斥和同步
后端
yzx99101342 分钟前
关于网络协议
网络·人工智能·python·网络协议
fangeqin44 分钟前
ubuntu源码安装python3.13遇到Could not build the ssl module!解决方法
linux·python·ubuntu·openssl
考虑考虑1 小时前
Springboot3.4.x中的@Bean使用
spring boot·后端·spring
努力的小雨1 小时前
AI编程实战:云开发疯狂助攻,React + Vite 做出 FPS 网页游戏不是梦
后端
Jay Kay2 小时前
TensorFlow源码深度阅读指南
人工智能·python·tensorflow
会的全对٩(ˊᗜˋ*)و2 小时前
【数据挖掘】数据挖掘综合案例—银行精准营销
人工智能·经验分享·python·数据挖掘