Flask框架之WTForms(详解)

简介: Flask框架之WTForms(详解)

目录


WTForms介绍和基本使用


WTForms介绍


基本使用


WTForms表单验证的基本使用


WTForms常用验证器


WTForms自定义验证器


场景:验证码实现


WTForms渲染模版


常用的方法


代码示例




WTForms介绍和基本使用

66.png


WTForms介绍


这个插件库主要有两个作用。


第一个是做表单验证,将用户提交上来的数据进行验证是否符合系统要求。


第二个是做模版渲染。 (了解即可)


官网:https://wtforms.readthedocs.io/en/latest/index.html


基本使用


Flask-WTF是简化了WTForms操作的一个第三方库。WTForms表单的两个主要功能是验证用户提交数据的合法性以及渲染模板。而Flask-WTF还包括一些其他的功能CSRF保护,文件上传等


安装Flask-WTF默认也会安装WTForms,因此使用以下命令来安装Flask-WTF和WTForms:

pip install flask-wtf

1.导入WTForms类


Python文件中,导入所需的WTForms类,通常是wtformswtforms.validators

from wtforms import Form, StringField, IntegerField, validators

2.定义表单类


创建一个表单类来定义您的表单字段。表单类是一个继承自wtforms.Form的类,每个表单字段都是该类的属性。

class MyForm(Form):
    name = StringField('Name', validators=[validators.DataRequired()])
    age = IntegerField('Age', validators=[validators.NumberRange(min=1, max=100)])

3.表单实例化:


在您的视图函数或控制器中,实例化您的表单类。

form = MyForm()

4.在模板中渲染表单


在HTML模板中,使用表单的form属性渲染表单字段。

<form method="POST">
    {{ form.name.label }} {{ form.name() }}
    {{ form.age.label }} {{ form.age() }}
    <input type="submit" value="Submit">
</form>

5.处理表单提交


在您的视图函数或控制器中,检查表单是否被提交并验证数据。

if form.validate_on_submit():
    name = form.name.data
    age = form.age.data
    # 处理表单数据

6.验证表单数据:


在表单类的字段定义中,可以使用内置的验证器来验证数据。例如,DataRequired验证器可用于确保字段不为空,NumberRange验证器可用于验证数值的范围等。还可以使用自定义验证器来满足特定需求。

name = StringField('Name', validators=[validators.DataRequired()])
age = IntegerField('Age', validators=[validators.NumberRange(min=1, max=100)])

WTForms表单验证的基本使用


1.自定义一个表单类,继承自wtforms.Form类。


2.定义好需要验证的字段,字段的名字必须和模版中那些需要验证的input标签的name属性值保持一致。


3.在需要验证的字段上,需要指定好具体的数据类型。


4.在相关的字段上,指定验证器。


5.以后在视图函数中,只需要使用这个表单类的对象,并且把需要验证的数据,也就是request.form传给这个表单类,再调用表单类对象.validate()方法进行,如果返回True,那么代表用户输入的数据都是符合格式要求的,Flase则代表用户输入的数据是有问题的。如果验证失败了,那么可以通过表单类对象.errors来获取具体的错误信息。


WTForms常用验证器


页面把数据提交上来,需要经过表单验证,进而需要借助验证器来进行验证,以下是常用的内置验证器:


1. Length:字符串长度限制,有min和max两个值进行限制。

username = StringField(validators=[Length(min=3,max=10,message="用户名长度必须在3到10位之间")])

2. EqualTo:验证数据是否和另外一个字段相等,常用的就是密码和确认密码两个字段是否相等。

password_repeat = StringField(validators=[Length(min=6,max=10),EqualTo("password")])

3. Email:验证上传的数据是否为邮箱数据格式 如:223333@qq.com

email = StringField(validators=[Email()])

4. InputRequired:验证该项数据为必填项,即要求该项非空。

username = StringField(validators=[input_required()])

5. NumberRange:数值的区间,有min和max两个值限制,如果处在这两个数字之间则满足。

age = IntegerField(validators=[NumberRange(12,18)])

6. Regexp:定义正则表达式进行验证,如验证手机号码。

phone = StringField(validators=[Regexp(r'1[34578]\d{9}')])

7. URL:必须是URL的形式 如http://www.bjsxt.com

home_page = StringField(validators=[URL()])

8. UUID:验证数据是UUID类型。

uuid = StringField(validators=[UUID()])

数据项的类型,一般常用的有

from wtforms import Form,StringField,IntegerField
class RegisterForm2(Form):
  uname = StringField(validators=[InputRequired()])
  age = IntegerField(validators=[NumberRange(18,40)])

WTForms自定义验证器


只有当WTForms内置的验证器不够使的时候,才需要使用自定义验证器。


如果想要对表单中的某个字段进行更细化的验证,那么可以针对这个字段进行单独的验证。


自定义验证器步骤如下:


1.定义一个方法,方法的名字规则是:validate_字段名(self,field)。


2.在方法中,使用field.data可以获取到这个字段的具体的值。


3.验证时,如果数据满足条件,那么可以什么都不做。如果验证失败,

那么应该抛出一个wtforms.validators.ValidationError的异常,并且把验证失败的信息传到这个异常类中。


场景:验证码实现


关键代码:

from flask import session
from wtforms import Form,StringField,IntegerField
from wtforms.validators import Length,EqualTo,Email,InputRequired,NumberRange,Regexp,URL,UUID,ValidationError
class RegisterForm2(Form):
  email = StringField(validators=[Email()])
  uname = StringField(validators=[InputRequired()])
  age = IntegerField(validators=[NumberRange(18,40)])
  phone = StringField(validators=[Regexp(r'1[34578]\d{9}')])
  phomepage = StringField(validators=[URL()])
  uuid = StringField(validators=[UUID()])
  code = StringField(validators=[Length(4,4)])
  #取到的值 和服务器上 session上存储的值对比
  def validate_code(self,field):
    print(field.data,session.get('code'))
    if field.data != session.get('code'):
      raise ValidationError('验证码不一致!')

WTForms渲染模版


渲染模版是WTForms的第二个作用,不过,我们只需要了解即可,不需要花太多精力和时间去研究它。


常用的方法


1.field(): 用于渲染字段的默认HTML控件。例如,{{ form.name() }}会渲染名为"name"的字段的默认控件。

2.label(): 用于渲染字段的标签。例如,{{ form.name.label }}会渲染名为"name"的字段的标签。

3.errors(): 用于渲染字段的错误消息。例如,{{ form.name.errors }}会渲染名为"name"的字段的错误消息。


代码示例

<form method="POST">
    <div class="form-group">
        {{ form.name.label(class="form-label") }}
        {{ form.name(class="form-control") }}
        {% if form.name.errors %}
            <ul class="error-list">
                {% for error in form.name.errors %}
                    <li>{{ error }}</li>
                {% endfor %}
            </ul>
        {% endif %}
    </div>
    <div class="form-group">
        {{ form.age.label(class="form-label") }}
        {{ form.age(class="form-control") }}
        {% if form.age.errors %}
            <ul class="error-list">
                {% for error in form.age.errors %}
                    <li>{{ error }}</li>
                {% endfor %}
            </ul>
        {% endif %}
    </div>
    <input type="submit" value="Submit" class="btn btn-primary">
</form>

使用Bootstrap样式来为表单字段添加了class属性。通过调用label()方法和class参数,可以为标签添加自定义的CSS类。通过调用字段对象的class参数,可以为表单字段添加自定义的CSS类。在错误消息部分,我们使用了一个循环来渲染所有的错误消息。

相关文章
|
4月前
|
开发框架 开发者 Python
深入探究Python Web开发框架:Flask与Django
Python作为一种广泛应用于Web开发的编程语言,其拥有众多优秀的Web开发框架。本文将深入探讨其中两大知名框架——Flask与Django。通过对它们的概念与实践进行比较分析,帮助读者更好地理解和选择适合自己项目需求的Web开发框架。
|
27天前
|
安全 数据库 C++
Python Web框架比较:Django vs Flask vs Pyramid
【4月更文挑战第9天】本文对比了Python三大Web框架Django、Flask和Pyramid。Django功能全面,适合快速开发,但学习曲线较陡;Flask轻量灵活,易于入门,但默认配置简单,需自行添加功能;Pyramid兼顾灵活性和可扩展性,适合不同规模项目,但社区及资源相对较少。选择框架应考虑项目需求和开发者偏好。
|
15天前
|
API 数据库 数据安全/隐私保护
Flask框架在Python面试中的应用与实战
【4月更文挑战第18天】Django REST framework (DRF) 是用于构建Web API的强力工具,尤其适合Django应用。本文深入讨论DRF面试常见问题,包括视图、序列化、路由、权限控制、分页过滤排序及错误处理。同时,强调了易错点如序列化器验证、权限认证配置、API版本管理、性能优化和响应格式统一,并提供实战代码示例。了解这些知识点有助于在Python面试中展现优秀的Web服务开发能力。
24 1
|
1月前
|
前端开发 安全 JavaScript
Python的Flask框架的学习笔记(前后端变量传送,文件上传,网页返回)内含实战:实现一个简单的登录页面
Python的Flask框架的学习笔记(前后端变量传送,文件上传,网页返回)内含实战:实现一个简单的登录页面
|
4月前
|
前端开发 数据库 Python
使用 Python 的 Web 框架(如 Django 或 Flask)来建立后端接口,用于处理用户的请求,从数据库中查找答案并返回给前端界面
【1月更文挑战第13天】使用 Python 的 Web 框架(如 Django 或 Flask)来建立后端接口,用于处理用户的请求,从数据库中查找答案并返回给前端界面
95 7
|
11天前
|
API 开发者 Python
Django和Flask框架的主要区别是什么?
Django与Flask是Python Web开发的两大框架,各有特色。Django遵循“约定优于配置”,提供全栈式解决方案,适合大型项目和快速开发,但定制性相对有限。Flask是微框架,核心简洁,注重灵活性和可扩展性,适用于小型项目、高度定制的复杂项目及API开发。选择框架应考虑项目需求、团队技能和开发者偏好。
16 1
|
15天前
|
SQL 中间件 API
Flask框架在Python面试中的应用与实战
【4月更文挑战第18天】**Flask是Python的轻量级Web框架,以其简洁API和强大扩展性受欢迎。本文深入探讨了面试中关于Flask的常见问题,包括路由、Jinja2模板、数据库操作、中间件和错误处理。同时,提到了易错点,如路由冲突、模板安全、SQL注入,以及请求上下文管理。通过实例代码展示了如何创建和管理数据库、使用表单以及处理请求。掌握这些知识将有助于在面试中展现Flask技能。**
16 1
Flask框架在Python面试中的应用与实战
|
18天前
|
JSON 数据格式 Python
如何在Flask框架中定义路由和处理请求?
【4月更文挑战第18天】在Flask框架中,创建应用实例、定义路由和处理请求涉及5个步骤:1) 导入Flask并实例化应用;2) 使用`app.route()`装饰器定义路由,指定URL和HTTP方法;3) 编写视图函数处理请求逻辑;4) 视图函数返回响应内容,Flask会自动转换格式;5) 用`app.run()`启动服务器。
25 3
|
20天前
|
Python
编写自己的Flask扩展:扩展框架的无限可能
【4月更文挑战第16天】本文介绍了如何编写Flask扩展以增强其功能。Flask扩展用于添加框架未内置的高级特性。一个扩展通常包括初始化函数、上下文处理器、命令行工具、信号处理和辅助函数。文中通过一个简单的自定义日志记录扩展示例,展示了创建扩展的步骤。扩展类`CustomLogger`包含初始化、请求前记录日志和自定义日志函数。通过`init_custom_logger`函数在应用中注册扩展。最后,展示了如何在应用中使用该扩展记录日志。编写Flask扩展可实现复杂逻辑、定制命令和处理事件,从而打造功能丰富的Web应用。
|
21天前
|
前端开发 数据挖掘 API
使用Python中的Flask框架进行Web应用开发
【4月更文挑战第15天】在Python的Web开发领域,Flask是一个备受欢迎的轻量级Web框架。它简洁、灵活且易于扩展,使得开发者能够快速地构建出高质量的Web应用。本文将深入探讨Flask框架的核心特性、使用方法以及在实际开发中的应用。