手机网站网站开发流程,网站备案个人使用,免费做网站平台,建设网站有哪些步骤文章目录 4 表单4.1 HTML表单4.2 使用Flask-WTF4.3 处理表单数据4.4 表单进阶实践小记 4 表单
表单是和用户交互最常见的方式之一#xff0c;本章涉及的Python包由WTForms、Flask-WTF、Flask-CKEditor。#xff08;p104#xff09;
4.1 HTML表单
通过form标签创建… 文章目录 4 表单4.1 HTML表单4.2 使用Flask-WTF4.3 处理表单数据4.4 表单进阶实践小记 4 表单
表单是和用户交互最常见的方式之一本章涉及的Python包由WTForms、Flask-WTF、Flask-CKEditor。p104
4.1 HTML表单
通过form标签创建表单input标签创建字段。
form methodpostinput typetext nameusername placeholder用户名
/formWTForms支持在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代码默认只包含id和name属性其他属性可以 1、使用render_kw属性p1092、在调用时传入
在模板中渲染表单我们需要把表单类实例传入模板然后再模板中调用表单类的属性即可获取字段对应的HTML代码。
return render_template(basic.html, formform)form methodpost{{ form.csrf_token }}{{ form.username.label }}{{ form.username(classform-contorl) }} !-- 调用时传入额外属性值 --
/formCSRF字段在提交表单后会自动验证该字段为使验证通过需渲染。 可以手动编写HTML表单的代码name属性与表单类保持一致。
4.3 处理表单数据
1 过程解析请求 -- 转换为Python数据类型 -- 验证 -- 处理。
2 提交表单在HTML中当form标签声明的表单中类型为submit的提交字段被点击时就会创建一个提交表单的HTTP请求。 HTML表单中控制提交行为的属性action目标URLmethodHTTP请求方法enctype表单数据编码类型。p112 3 验证表单数据
客户端验证可以实时动态提示用户的输入是否正确降低服务器负载。可以通过HTML5内置的验证属性或Javascript实现。服务器端验证必须的因为客户端不可靠。
!-- 使用html5属性 --
input typetext nameusername requiredWTForms验证机制实例化表单类时传入数据然后调用实例的validate()方法错误消息会存储到实例的errors属性对应的字典中。 form.errors # 错误消息字典获取数据data属性是一个匹配所有字段与对应数据的字典。 form.username.dataPRG模式Post/Redirect/Get)在浏览器中刷新页面时的默认行为是发送上一个请求会导致重复提交表单。因此在处理表单后应返回一个重定向响应GET。
4 渲染错误消息WTForms会把错误消息添加到表单类的errors属性中这是一个匹配作为表单字段的类属性到对应的错误消息列表的字典。 form.username.errors4.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参数列表的可调用对象接受form和field字段两个位置参数。(p121)
行内验证器在表单类中定义用来验证某个特定的字段。全局验证器可重用。定义一个函数在验证不通过时抛出ValidateionError异常。若需支持参数可用工厂函数形式。 工厂函数返回一个可调用对象的函数。 4 文件上传
渲染字段在HTML中渲染一个文件上传字段只需要将input字段的type属性值设置为file。
input typefile可以使用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属性时则会被处理为True或False。
if form.validata_on_submit():if form.save.data:...if form.publish.data:...7 单个页面多个表单
问题是判断当前被提交的是哪个表单。
单视图处理为两个表单的提交字段设置不同的名称。多视图处理通常在一个处理表单的视图函数内包含了两类工作渲染GET、处理提交的表单POST。因此可以单独创建一个渲染的视图函数再为两个表单分别创建提交的视图函数。 注表单提交请求的目标URL通过action属性设置。 小记
表单这一节的内容比较丰富、繁杂涉及的调包操作也较多看完后仍有不少细节之处理解模糊。偶尔会体会到之前看过的《Python工匠》对于我理解本书内容的帮助。
学这节的时候我看得多动手少难免看了后面忘前面。一节书看完再去看相关的源代码时却仍有些看不懂。