Flask狼书笔记 | 04_表单

请添加图片描述

文章目录

  • 4 表单
    • 4.1 HTML表单
    • 4.2 使用Flask-WTF
    • 4.3 处理表单数据
    • 4.4 表单进阶实践
    • 小记

4 表单

表单是和用户交互最常见的方式之一,本章涉及的Python包由WTFormsFlask-WTFFlask-CKEditor。(p104)

4.1 HTML表单

通过<form>标签创建表单,<input>标签创建字段。

<form method="post"><input type="text" name="username" placeholder="用户名">
</form>

WTForms:支持在Python中使用类定义表单,然后通过类定义生成对应的HTML代码。

4.2 使用Flask-WTF

Flask-WTF在Flask中集成了表单数据解析、CSRF保护、文件上传等功能。

# 设置密钥,flask-wtf使用程序密钥来对csrf令牌进行签名(?)
app.secret_key = 'secret string'

定义表单类

from wtforms import Fromclass LoginForm(Form):...
  • 常用的WTForms字段、实例化字段常用参数、常用的WTForms验证器,见(p107)。

输出HTML代码

>>> form = LoginForm()
>>> form.username()  # 假设在类中定义了username字段
>>> form.username.label()
  • 添加额外属性:输出的字段HTML代码默认只包含idname属性,其他属性可以:
    • 1、使用render_kw属性(p109)
    • 2、在调用时传入

在模板中渲染表单:我们需要把表单类实例传入模板,然后再模板中调用表单类的属性即可获取字段对应的HTML代码。

return render_template('basic.html', form=form)
<form method="post">{{ form.csrf_token }}{{ form.username.label }}{{ form.username(class='form-contorl') }} <!-- 调用时传入额外属性值 -->
</form>
  • CSRF字段:在提交表单后会自动验证该字段,为使验证通过,需渲染。

  • 可以手动编写HTML表单的代码,name属性与表单类保持一致。

4.3 处理表单数据

1 过程:解析请求 --> 转换为Python数据类型 --> 验证 --> 处理。

2 提交表单:在HTML中,当<form>标签声明的表单中类型为submit的提交字段被点击时,就会创建一个提交表单的HTTP请求。

HTML表单中控制提交行为的属性:action(目标URL),method(HTTP请求方法),enctype(表单数据编码类型)。(p112)

3 验证表单数据

  • 客户端验证:可以实时动态提示用户的输入是否正确,降低服务器负载。可以通过HTML5内置的验证属性,或Javascript实现。
  • 服务器端验证:必须的,因为客户端不可靠。
<!-- 使用html5属性 -->
<input type="text" name=username" required>
  • WTForms验证机制:实例化表单类时传入数据,然后调用实例的validate()方法,错误消息会存储到实例的errors属性对应的字典中。
>>> form.errors # 错误消息字典
  • 获取数据data属性是一个匹配所有字段与对应数据的字典。
>>> form.username.data
  • PRG模式:(Post/Redirect/Get),在浏览器中,刷新页面时的默认行为是发送上一个请求,会导致重复提交表单。因此在处理表单后应返回一个重定向响应(GET)。

4 渲染错误消息:WTForms会把错误消息添加到表单类的errors属性中,这是一个匹配作为表单字段的类属性到对应的错误消息列表的字典

>>> form.username.errors

4.4 表单进阶实践

简化表单处理过程的技巧,以及表单的一些非常规应用

1 设置错误消息语言:如下,所有继承MyBaseForm的表单类,将使用新设置的错误消息默认语言。

from flask_wtf import FlaskForm app = Flask(__name__)
app.config['WTF_I18N_ENABLED'] = Falseclass MyBaseForm(FlaskForm):class Meta:locals = ['zh']class HelloFrom(MyBaseForm):...

疑惑:类内部再定义一个Meta类是什么操作?

2 使用宏渲染表单:在模板中渲染表单时,存在大量的重复工作:获取<input>定义、获取<label>定义、渲染错误消息。为了避免每一个字段重复这些代码,可以创建一个宏。(p120)

{% macro form_field(field) %}{{ field.label}}<br>{{ field(**kwargs) }}<br>{% if field.errors %}{% for error in field.errors %}{{ error }}{% endfor %}{% endif %}
{% end macro %}

3 自定义验证器:验证器是指在定义字段时传入validators参数列表的可调用对象,接受formfield(字段)两个位置参数。(p121)

  • 行内验证器:在表单类中定义,用来验证某个特定的字段。
  • 全局验证器:可重用。定义一个函数,在验证不通过时抛出ValidateionError异常。若需支持参数,可用工厂函数形式

工厂函数:返回一个可调用对象的函数。

4 文件上传

  • 渲染字段:在HTML中,渲染一个文件上传字段只需要将<input字段的type属性值设置为file。
<input type="file">

可以使用Flask-WTF提供的FileField类创建文件上传字段,验证器包括FileRequired(是否包含文件对象)和FileAllowed(验证文件类型)。此外,可以通过限制请求报文的最大长度来限制文件大小:

app.config['MAX_CONTENT_LENGTH'] = 3 * 1024 * 1024
  • 获取文件:可以在request.files中获取,解析为Werkzeug中的FileStorage对象。不过Flask-WTF会自动获取
request.files.get('photo')# 在Flask-WTF中
f = form.photo.data
  • 处理文件名:可以过滤文件名中的危险字符,或统一重命名(使用uuid)。
  • 其它:还有保存文件获取保存后的文件多文件上传等问题,此处省略,用到的时候再细看吧!

疑惑:使用uuid重命名了文件,后续如何找到这个文件呢,将文件名保存到数据库?(毕竟文件名是随机生成的)

多文件:单击一次按钮,可以一次性选择多个文件并上传。


心得笔记:感觉文件上传这一块弯弯绕绕挺多的,一时间看得有点懵。

5 使用Flask-CKEditor集成富文本编辑器:对我也是一个黑盒子 的感觉(p129)

疑惑:文本应该以什么形式保存?

6 单个表单多个提交按钮

如“发布文章”和“保存草稿”,需根据按钮做出不同的处理。可在表单类创建多个SubmitField类型的字段,只有被点击的字段才会出现在reqeust.form字典中,而调用data属性时则会被处理为TrueFalse

if form.validata_on_submit():if form.save.data:...if form.publish.data:...

7 单个页面多个表单

问题是判断当前被提交的是哪个表单。

  • 单视图处理:为两个表单的提交字段设置不同的名称。
  • 多视图处理:通常在一个处理表单的视图函数内包含了两类工作:渲染(GET)、处理提交的表单(POST)。因此可以单独创建一个渲染的视图函数,再为两个表单分别创建提交的视图函数。

:表单提交请求的目标URL通过action属性设置。

小记

表单这一节的内容比较丰富、繁杂,涉及的调包操作也较多,看完后仍有不少细节之处理解模糊。偶尔会体会到,之前看过的《Python工匠》对于我理解本书内容的帮助。

学这节的时候,我看得多,动手少,难免看了后面忘前面。一节书看完,再去看相关的源代码时却仍有些看不懂。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/109180.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

淘宝API技术解析,实现按图搜索淘宝商品

淘宝提供了开放平台接口&#xff08;API&#xff09;来实现按图搜索淘宝商品的功能。您可以通过以下步骤来实现&#xff1a; 1. 获取开放平台的访问权限&#xff1a;首先&#xff0c;您需要在淘宝开放平台创建一个应用&#xff0c;获取访问淘宝API的权限。具体的申请步骤和要求…

[QT]设置程序仅打开一个,再打开就唤醒已打开程序的窗口

需求&#xff1a;speedcrunch 这个软件是开源的计算器软件。配合launch类软件使用时&#xff0c;忘记关闭就经常很多窗口&#xff0c;强迫症&#xff0c;从网上搜索对版本进行了修改。 #include "gui/mainwindow.h"#include <QCoreApplication> #include <…

ubuntu学习(六)----文件编程实现cp指令

1 思路 Linux要想复制一份文件通常指令为&#xff1a; cp src.c des.c 其中src.c为源文件&#xff0c;des.c为目标文件。 要想通过文件编程实现cp效果&#xff0c;思路如下 1 首先打开源文件 src.c 2 读src到buf 3 创建des.c 4 将buf写入到des.c 5 close两个文件 2 实现 vi …

2023高教社杯数学建模思路 - 案例:FPTree-频繁模式树算法

文章目录 算法介绍FP树表示法构建FP树实现代码 建模资料 ## 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 算法介绍 FP-Tree算法全称是FrequentPattern Tree算法&#xff0c;就是频繁模式树算法&#xff0c…

【德哥说库系列】-Oracle 19C RAC 应用RU19补丁

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&am…

gPRC与SpringBoot整合教程

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

Nginx配置文件详解

Nginx配置文件详解 1、Nginx配置文件1.1主配置文件详解1.2子配置文件 2、全局配置部分2.1修改启动的工作进程数&#xff08;worker process) 优化2.2cpu与worker process绑定2.3 PID 路径修改2.4 修改工作进程的优先级2.5调试工作进程打开的文件的个数2.6关闭master-worker工作…

智慧工厂解决方案:推动制造业转型升级的新引擎

随着信息技术的迅猛发展和制造业竞争的加剧&#xff0c;智慧工厂成为了推动制造业转型升级的重要引擎。智慧工厂解决方案通过整合物联网、人工智能、大数据分析等先进技术&#xff0c;实现生产过程的智能化、自动化和高效化&#xff0c;为企业提供了更加灵活、智能的生产模式和…

基于亚马逊云科技服务,构建大语言模型问答知识库

随着大语言模型效果明显提升&#xff0c;其相关的应用不断涌现呈现出越来越火爆的趋势。其中一种比较被广泛关注的技术路线是大语言模型&#xff08;LLM&#xff09;知识召回&#xff08;Knowledge Retrieval&#xff09;的方式&#xff0c;在私域知识问答方面可以很好的弥补通…

Kotlin 高阶函数详解

高阶函数 在 Kotlin 中&#xff0c;函数是一等公民&#xff0c;高阶函数是 Kotlin 的一大难点&#xff0c;如果高阶函数不懂的话&#xff0c;那么要学习 Kotlin 中的协程、阅读 Kotlin 的源码是非常难的&#xff0c;因为源码中有太多高阶函数了。 高阶函数的定义 高阶函数的…

vue中form、table和input标签过长

form标签过长 效果&#xff1a; 代码&#xff1a; <el-form-item v-for"(item,index) in ticketEditTable1" :label"item.fieldNameCn" :propitem.fieldName :key"item.fieldNameCn" overflow"":rules"form[item.fieldName…

8年测试经验之谈 —— 什么是全链路压测?

随着互联网技术的发展和普及&#xff0c;越来越多的互联网公司开始重视性能压测&#xff0c;并将其纳入软件开发和测试的流程中。 阿里巴巴在2014 年双11 大促活动保障背景下提出了全链路压测技术&#xff0c;能更好的保障系统可用性和稳定性。 什么是全链路压测&#xff1f; …

【AutoLayout案例04-游戏图片-按钮适配 Objective-C语言】

一、好,我们再看一个案例, 刚才,这个案例, 这么一个案例 这个案例,是什么意思呢, 这里给大家做一个3.5英寸、4.0英寸的屏幕适配, 因为我们这里图片,只有一个,就是4英寸的这么一个图片 什么意思呢,要求我们在3.5英寸的屏幕、和4英寸的屏幕的时候,都能正常显示这个图…

基于大数据+django+mysql的学习资源推送系统的设计与实现(含报告+源码+指导)

本系统为了数据库结构的灵活性所以打算采用MySQL来设计数据库&#xff0c;而Python技术&#xff0c; B/S架构则保证了较高的平台适应性。文中主要是讲解了该系统的开发环境、要实现的基本功能和开发步骤&#xff0c;并主要讲述了系统设计方案的关键点、设计思想。 由于篇幅限制…

2.神经网络的实现

创建神经网络类 import numpy # scipy.special包含S函数expit(x) import scipy.special # 打包模块 import pickle# 激活函数 def activation_func(x):return scipy.special.expit(x)# 用于创建、 训练和查询3层神经网络 class neuralNetwork:# 初始化神经网络def __init__(se…

【数据分析】统计量

1. 均值、众数描述数据的集中趋势度量&#xff0c;四分位差、极差描述数据的离散程度。 2. 标准差、四分位差、异众比率度量离散程度&#xff0c;协方差是度量相关性。 期望值分别为E[X]与E[Y]的两个实随机变量X与Y之间的协方差Cov(X,Y)定义为&#xff1a; 从直观上来看&…

Vue2向Vue3过度核心技术自定义指令

目录 1 自定义指令1.指令介绍2.自定义指令3.自定义指令语法4.指令中的配置项介绍5.代码示例6.总结 2 自定义指令-指令的值1.需求2.语法3.代码示例 3 自定义指令-v-loading指令的封装1.场景2.需求3.分析4.实现5.准备代码 1 自定义指令 1.指令介绍 内置指令&#xff1a;v-html、v…

channel并发编程

不要通过共享内存通信&#xff0c;要通过通信共享内存。 channel是golang并发编程中一种重要的数据结构&#xff0c;用于多个goroutine之间进行通信。 我们通常可以把channel想象成一个传送带&#xff0c;将goroutine想象成传送带周边的人&#xff0c;一个传送带的上游放上物品…

四信重磅推出5G RedCap AIoT摄像机 RedCap轻量级5G终端新品首发!

6月6日&#xff0c;四信受邀出席移动物联网高质量发展论坛&#xff0c;并在移动物联网新产品发布环节隆重推出5G RedCap AIoT摄像机&#xff0c;再次抓紧需求先机&#xff0c;为行业用户创造无限可能&#xff01; 两大应用场景 助推RedCap走深向实 火遍全网络的RedCap应用场景可…

【JavaEE进阶】MyBatis表查询

文章目录 一. 使用MyBatis完成数据库的操作1. MyBatis程序中sql语句的即时执行和预编译1.1 即时执行&#xff08;${}&#xff09;1.2 预编译&#xff08;#{}&#xff09;1.3 即时执行和预编译的优缺点 2. 单表的增删改等操作2.1 增加操作2.2 修改操作2.3 删除操作2.4 like(模糊…