第45天:Web表单

简介: 第45天:Web表单

在了解了 Flask Bootstrap 基本框架之后,我们来了解一下 Flask 框架的 表单( form ),以帮助我们创建交互式的 Web 应用,最后会有个提交个人信息的例子。


Flask-WTF 是 Flask 框架的一个扩展,用来做表单的交互,是对 WTForms 的集成,默认支持 CSRF 安全签名,并且继承文件上传功能。


安装


使用 pip 安装


pip install Flask-WTF

验证


>>> from flask_wtf import FlaskForm>>>


小试牛刀


创建表单类


Flask-WTF 能将 WTForms 集成到 Flask 应用中,创建一个 app.py 主代码文件,例如:


from flask_wtf import FlaskFormfrom wtforms import StringFieldfrom wtforms.validators import DataRequired
class MyForm(FlaskForm):    name = StringField('name', validators=[DataRequired()])

MyForm 是自定义的类,继承自 FlaskForm,其中定义了一个字段 name,标题是 name, 且设置为非空。


表单模板


接下来创建一个表单模板 submit.html,例如:


<form method="POST" action="/">    {{ form.csrf_token }}    {{ form.name.label }} {{ form.name(size=20) }}    <input type="submit" value="Go"></form>

其中 form.csrf_token 是 Flask-WTF 提供的一个防止跨站请求伪造的隐藏字段。原理是将一个密钥根据请求特征加密,在表单提交时一起送到服务器端,作校验。

密钥串与多种定义方式,为了方便,这里将密钥串定义在应用上:


app.secret_key = 'abc'

注意:上示例仅作演示说明,不能在生产系统中用这样简单的密钥

之后则是对字段 name 的模板定义,经过渲染会替换成 Html 控件。


定义视图函数


视图函数首先需要将表单渲染出来,另外要对表单的提交作验证,当然视图函数与提交验证函数也可不是同一个:


@app.route('/', methods=('GET', 'POST'))def submit():    form = MyForm()    if form.validate_on_submit():        return redirect('/success')    return render_template('submit.html', form=form)


提交表单一般都是 POST 方法,所以要确保视图函数支持 POST


视图函数中实例化一个 MyForm,值得注意的时,FlaskForm 示例化时会使用 request 中的 form 来初始化,所以在下面才可以直接来校验表单


validate_on_submit 方法是 is_submitted 和 validate 的联合校验,后面会详述

如果验证通过将跳转到 /success,如果没有通过,用 form 来渲染 submit.html 模板,


运行


在主代码  app.py 中加入启动方法:


if __name__ == '__main__':  app.run(debug=True)


然后运行,如果一起正常,访问 localhost:5000, 就能看输入框和提交按钮,点击提交,会跳转到 /success 或者提升必填。


表单


FlaskForm 是 WTForms Form 的子类,可以用来定一个表单,定义表单中的字段,验证方式等,作为一个 Flask 和 Html 之间的一个数据载体。


另外 FlaskForm 集成了 CSRF 校验,方便编写程序的同时,提高访问安全性。定义 Form 对象时不用明确声明 CSRF 字段,只需要在表单模板中填写  form.csrf_token 就行,提交表单时,视图函数会自动对 CSRF 进行校验。


FlaskForm 实例化参数中有个 formdata 参数,用来设定 Form 中字段的值,在视图函数中,可以不提供 formdata,会将 request.form 或者 request.files 中获取,作为 formdata 参数,这就是视图函数中实例化 Form 时,不带任何参数,在后面还能方法 Form 对象内容的原因。


字段及验证


FlaskForm 从 0.9.0 版本开始,不再从 WTForms 中导入任何东西,所以大部分字段和校验方法都直接引用自 WTForms如:


from wtforms import StringField, IntergreField, validators


  • 常用的字段
字段 说明
StringField 文本字段
IntergreField 文本字段,要求输入的时数字
PasswordField 文本字段,输入内容会转会为小黑点
DateField 文本字段,输入指定日期格式的字符串会转会为日期类型
RadioField 单选字段
SelectField 选择字段
SelectMultipleField 多项选择字段
SubmitField 表单的提交按钮


  • 常用验证
验证 说明
DataRequired 必填字段
Email 电子邮箱地址验证
EqualTo 验证与其他指定字段值是否相等
Length 输入字符串长度限制
NumberRange 输入数值大小限制
URL 网站格式验证

例如定义一个 MyForm 表单类:


class MyForm(FlaskForm):    name = StringField(label='姓名', validators=[InputRequired()])    city = StringField('城市', validators=[validators.Length(min=4, max=25, message='输入的长度不符合要求')])    birthday = DateField(label='生日', format="%Y-%m-%d", validators=[DataRequired('日期格式不正确')])    gender = RadioField(label='性别', choices=[(1, 'male'), (2, 'female')])    interest = SelectMultipleField(label='兴趣', choices=[(1, 'Football'), (2, 'Movies'), (3, 'Reading')])


如果字段值验证失败,会将错误信息存放在字段的 errors 属性中,errors 是个列表,元素是每一个验证出现的问题信息,通过设定验证的 message 参数指定。


要完整的在模板中定义字段以及错误信息,是件乏味的事情,这里通过一个自定义的模板宏来完成:



{% macro render_field(field) %}  <dt>{{ field.label }}:  <dd>{{ field(**kwargs)|safe }}  {% if field.errors %}    <ul class=errors>    {% for error in field.errors %}      <li>{{ error }}</li>    {% endfor %}    </ul>  {% endif %}  </dd>{% endmacro %}


文件上传


上传文件,是表单应用必不可少的,可以通过 FileField 字段来设置,因为需要视图函数对上传的文件进行处理,所以这里单独作说明


定义一个有上传文件字段的表单类:


from flask_wtf.file import FileField
class PhotoForm(FlaskForm):  photo = FileField('上传照片')

视图函数定义为:



@app.route('/upload', methods=['GET', 'POST'])def upload():    form = PhotoForm()    filepath = None    if form.validate_on_submit():        filename = secure_filename(form.photo.data.filename)        file = form.photo.data        filepath = os.path.join(app.config['UPLOAD_FOLDER'], filename)        file.save( filepath )    else:        filename = None    return render_template('photo.html', form=form, filename= filename)


在通过验证之后,用方法 secure_filename 对上传文件名作安全处理,这是很有必要的,以防止通过文件名注入, 这个方法从库 werkzeug 中导入,这个库会在在安装 Flask 时一起被安装。


之后拿到上传文件的数据,这是已经经过 Flask 转化的 File 对象,可以直接调用 save 方法存储上传的文件。


app.config['UPLOAD_FOLDER'] 定义了文件存储的位置,如:


app.config['UPLOAD_FOLDER'] = './upload'

最后新建一个模板文件 upload.html:


<form action="/upload" method="post" enctype="multipart/form-data">    {{ form.csrf_token() }}    {{ form.photo() }}    <input type="submit" value="提交"></form>


注意模板中 form 的编码类型必须设置为 multipart/form-data


Bootstrap


虽然 FlaskForm 使用起来已经很方便了,但是还是有很多需要重复编写的地方,以及展示效果不够美观的问题,借助 Bootstrap-flask 将解决这些问题。


之前对 Bootstrap-flask 介绍中说国,Bootstrap-flask 主要是定义了很多模板宏,减少重复的编码,对于表单,同样提供了很多宏


首先在模板中导入 bootstrap 的 Form 相关宏:


{% from 'bootstrap/form.html' import render_form, render_form_row, render_field %}
  • render_form 接受一个 Form 对象,将其渲染成 Html 表单,是最省事的,例如:


{{ render_form(form) }}
  • render_field 接受一个 Field, 将其渲染成一个表单的字段:


{{ render_field(form.name) }}
  • render_form_row 接受一个 Field 列表,将列表中的字段渲染到一行

模板代码如下:


{% from 'bootstrap/form.html' import render_form, render_form_row, render_field %}{{ bootstrap.load_css() }}<h1> render_form </h1>{{ render_form(form) }}
<h1>render_form_row</h1><form method="post" >    {{ render_form_row([form.name, form.city]) }}    {{ render_form_row([form.gender, form.birthday]) }}    {{ render_form_row([form.interest]) }}</form>
<h1>render_field</h1><form method="post" >    {{ render_field(form.name) }}    {{ render_field(form.gender) }}    {{ render_field(form.interest) }}</form>


先导入表单相关的宏,然后加入 Bootstrap 的样式,之后是各个宏的使用


总结



本节课程简单介绍了 Flask 中表单的处理方式和方法,包括 FlaskForm,WTForms和一些常用的字段,最后说明了 Bootstrap-flask 对表单的支持,以便是 Web 开发更高效。

示例代码:Python-100-days-day045

参考


系列文章

   第44天:Flask 框架集成Bootstrap

   第43天:Python filecmp&difflib模块

   第42天:Python paramiko 模块

   第41天:Python operator 模块

   第0-40天:从0学习Python 0-40合集

目录
相关文章
|
6月前
|
前端开发
Web前端---表格和表单
Web前端---表格和表单
75 1
|
6月前
|
缓存 安全 Java
7:Servlet表单-Java Web
7:Servlet表单-Java Web
65 0
|
2月前
|
前端开发 数据安全/隐私保护
【前端web入门第二天】03 表单-下拉菜单 文本域 label标签 按钮 【附注册信息综合案例】
本文档详细介绍了HTML表单的多种元素及其用法,包括下拉菜单(`&lt;select&gt;` 和 `&lt;option&gt;`)、文本域(`&lt;textarea&gt;`)、标签解释(`&lt;label&gt;`)、各类按钮(`&lt;button&gt;`)及表单重置功能、无语义布局标签(`&lt;div&gt;` 和 `&lt;span&gt;`)以及字符实体的应用。此外,还提供了一个完整的注册信息表单案例,涵盖个人信息、教育经历和工作经历等部分,展示了如何综合运用上述元素构建实用的表单。
【前端web入门第二天】03 表单-下拉菜单 文本域 label标签 按钮 【附注册信息综合案例】
|
2月前
|
前端开发 数据安全/隐私保护
【前端web入门第二天】02 表单-input标签-单选框-多选框
本文介绍了HTML中`&lt;input&gt;`标签的基本使用方法及其应用场景,如登录、注册页面和搜索区域。通过设置`type`属性,可以实现文本框、密码框、单选框、多选框及文件上传等功能。此外,还详细说明了占位文本的使用、单选框的常用属性及多选框的默认选中状态,并提供了示例代码与效果展示。
|
3月前
|
安全 前端开发 PHP
构建与验证表单:传统PHP与Laravel框架的比较分析——探索Web开发中表单处理的优化策略和最佳实践
【8月更文挑战第31天】在 Web 开发中,表单构建与数据验证至关重要。传统 PHP 方法需手动处理 HTML 表单和数据验证,而 Laravel 框架则提供了一种更现代、高效的解决方案。本文通过对比传统 PHP 和 Laravel 的方法,探讨表单构建与验证的最佳实践。Laravel 通过简洁的语法糖、内置的数据过滤和验证机制,显著提升了代码的安全性和可维护性,适用于大型项目或需要快速开发的场景。然而,在追求灵活性的小型项目中,直接使用 PHP 仍是不错的选择。了解两者的优劣,有助于开发者根据项目需求做出最佳决策。
39 0
|
3月前
|
前端开发 开发者 安全
JSF表单处理大揭秘:数据绑定与事件处理,如何让Web应用更加智能?
【8月更文挑战第31天】在现代Web应用开发中,JSF(JavaServer Faces)框架因强大的表单处理能力而广泛应用。其数据绑定机制可实现表单控件与后端模型的双向传输,降低前后端耦合度,提高代码维护性和类型安全性。事件处理机制则支持丰富的内置与自定义事件,进一步增强应用灵活性。本文通过示例代码展示这些特性,帮助开发者更好地利用JSF构建高效、灵活的Web应用。然而,JSF也存在组件库较小和学习成本较高等局限,需根据具体需求权衡使用。
49 0
|
3月前
|
开发者 Java Spring
JSF 牵手社交登录,如魔法风暴席卷 Web 世界,开启震撼便捷登录之旅!
【8月更文挑战第31天】在互联网时代,便捷登录成为用户的核心需求。社交登录凭借其便捷性、安全性和社交化的特点,在各类Web应用中广泛应用。JavaServer Faces(JSF),作为一款流行的Java Web框架,能够轻松集成社交登录功能,显著提升用户体验。本文详细介绍社交登录的优势,并提供两种JSF集成社交登录的常见方法:一是利用Spring Social等第三方库简化开发;二是自行实现社交登录流程。开发者可根据项目需求选择适合的方案。
43 0
|
3月前
|
安全 Java 云计算
JSF 应用究竟何去何从?云端部署能否成为其全新突破点?快来一探究竟!
【8月更文挑战第31天】本文介绍了将JavaServer Faces(JSF)应用部署到云平台的过程。首先,根据成本、功能、可靠性和安全性选择合适的云平台。接着,展示了构建简单JSF应用的示例代码。最后,以AWS Elastic Beanstalk为例,详细说明了部署流程。部署至云端可提升应用的可用性、扩展性和安全性。
48 0
|
3月前
|
开发者 数据管理 Java
表单革命:Vaadin Forms如何重塑你的Web表单体验,打造用户互动新纪元
【8月更文挑战第31天】在现代Web开发中,表单是用户与应用交互的关键。Vaadin框架提供了强大的表单处理工具,简化了高效且用户友好表单的创建。本文深入探讨Vaadin Forms的工作原理,包括数据绑定、验证和事件处理等功能,并通过详细代码示例,帮助开发者掌握其使用方法,从而构建出满足各种需求的表单。
38 0
|
3月前
|
数据采集 前端开发 开发者
Angular表单控件详解:掌握模板驱动与响应式表单的精髓,让Web应用中的数据采集工作变得高效又简单,彻底告别繁琐的表单处理流程
【8月更文挑战第31天】表单是 Web 应用的关键组件,用于用户登录、注册及信息提交。Angular 作为成熟前端框架,提供了强大的表单处理功能,包括模板驱动与响应式表单。本文通过技术博客形式,详细介绍这两种表单控件,并提供示例代码,展示如何利用它们简化表单处理流程,提高开发效率。首先介绍简单的模板驱动表单,然后讲解基于 RxJS 的响应式表单,适用于复杂逻辑。通过本文,你将学会如何高效地使用 Angular 表单控件,提升应用的用户体验。
42 0

热门文章

最新文章

下一篇
无影云桌面