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

server/2025/2/12 9:43:12/

第 7 章 表单

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

如何在 Flask 中启用 CSRF 防护

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

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 扩展:

pip install flask-wtf
2. 创建一个表单类

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

python">from flask_wtf import FlaskForm
from wtforms import StringField
from wtforms.validators import DataRequired, Lengthclass 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.datayear = form.year.datamovie = 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 中渲染表单:

<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 支持文件上传功能,可以方便地处理文件类型的表单字段。

http://www.ppmy.cn/server/167020.html

相关文章

CEF132 编译指南 MacOS 篇 - depot_tools 安装与配置 (四)

1. 引言 在 CEF132&#xff08;Chromium Embedded Framework&#xff09;的编译过程中&#xff0c;depot_tools 扮演着举足轻重的角色。这套由 Chromium 项目精心打造的脚本和工具集&#xff0c;专门用于获取、管理和更新 Chromium 及其相关项目&#xff08;包括 CEF&#xff…

[前端] axios网络请求二次封装

一、场景描述 为什么要对axios网络请求进行二次封装? 解决代码的复用&#xff0c;提高可维护性。 —这个有两个方案&#xff1a;一个是二次封装一个是实例化。&#xff08;设置一些公共的参数&#xff0c;然后进行请求&#xff09; 为什么可以解决代码的复用&#xff1a; 这是…

日志2025.2.11

日志2025.2.11 1.增加了敌人滚动这个特殊技能 //具有翻滚技能的敌人实现翻滚 public void ActivateDodgeRoll() { if(meleeType ! EnemyType_Melee.Dodge) { return; } if(stateMachine.currentState ! chaseState) { …

【论文笔记】Are Self-Attentions Effective for Time Series Forecasting? (NeurIPS 2024)

官方代码https://github.com/dongbeank/CATS Abstract 时间序列预测在多领域极为关键&#xff0c;Transformer 虽推进了该领域发展&#xff0c;但有效性尚存争议&#xff0c;有研究表明简单线性模型有时表现更优。本文聚焦于自注意力机制在时间序列预测中的作用&#xff0c;提…

【Bug】属性 PackageVersion 应在所有目标框架中具有单个值,但却具有以下值

文章目录 问题问题代码原因解决处理Bug的具体步骤 问题 严重性 代码 说明 项目 文件 行 禁止显示状态 错误(活动) NU1105 无法读取“x”的项目信息: 属性 PackageVersion 应在所有目标框架中具有单个值&#xff0c;但却具有以下值: 1.0.0, 1.0.5 x (net8.0-android), x (net8.…

关于“前端已死”的命题

翻阅知乎论坛&#xff0c;看了各位大佬的解析&#xff0c;从技术发展、市场环境、岗位需求三个维度综合理解这个命题&#xff1a; 1. 技术层面 前端技术生态并未停滞&#xff0c;反而持续迭代升级。HTML/CSS/JavaScript 核心基础未变&#xff0c;但框架&#xff08;如 Vue、R…

Python查询成交量

#!/usr/bin/env python # encoding: utf-8author: yfh file: increaseVolumeModularSecond.py time: 2025/2/11 20:23 import baostock as bs import pandas as pd from datetime import datetime, timedelta# 登录baostock系统 def login_baostock():lg bs.login()if lg.erro…

京东商品评论数据采集并可视化

2 DrissionPage 在网页自动化操作场景中,使用 DrissionPage 实现一次登录后可在后续操作中复用登录状态,具有显著优势,下面详细介绍相关好处: 1. 节省时间与资源 减少登录操作时间:很多网站的登录流程可能涉及验证码输入、短信验证等步骤,这些操作不仅繁琐,还会消耗大…