flask框架中使用wtforms

一、什么是wtforms

WTForms是一个支持多个web框架的form组件,主要用于对用户请求数据进行验证。

安装:

pip3 install WTForms

二、简单使用wtforms组件

(一)用户登陆验证

py文件代码:

from  flask import Flask,render_template,request,redirect
from  wtforms.fields import core
from wtforms.fields import html5
from wtforms.fields import simple
from wtforms import Form
from wtforms import validators
from wtforms import widgets
app = Flask(__name__,template_folder="templates")

class Myvalidators(object):
    ‘‘‘自定义验证规则‘‘‘
    def __init__(self,message):
        self.message = message
    def __call__(self, form, field):
        print(field.data,"用户输入的信息")
        if field.data == "haiyan":
            return None
        raise validators.ValidationError(self.message)

class LoginForm(Form):
    ‘‘‘Form‘‘‘
    name = simple.StringField(
        label="用户名",
        widget=widgets.TextInput(),
        validators=[
            Myvalidators(message="用户名必须是haiyan"),#也可以自定义正则
            validators.DataRequired(message="用户名不能为空"),
            validators.Length(max=8,min=3,message="用户名长度必须大于%(max)d且小于%(min)d")
        ],
        render_kw={"class":"form-control"}  #设置属性
    )

    pwd = simple.PasswordField(
        label="密码",
        validators=[
            validators.DataRequired(message="密码不能为空"),
            validators.Length(max=8,min=3,message="密码长度必须大于%(max)d且小于%(min)d"),
            validators.Regexp(regex="\d+",message="密码必须是数字"),
        ],
        widget=widgets.PasswordInput(),
        render_kw={"class":"form-control"}
    )

@app.route(‘/login‘,methods=["GET","POST"])
def login():
    if request.method =="GET":
        form = LoginForm()
        return render_template("login.html",form=form)
    else:
        form = LoginForm(formdata=request.form)
        if form.validate():
            print("用户提交的数据用过格式验证,值为:%s"%form.data)
            return "登录成功"
        else:
            print(form.errors,"错误信息")
        return render_template("login.html",form=form)

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

login.html:

<body>
<form action="" method="post" novalidate>
    <p>{{ form.name.label }} {{ form.name }} {{ form.name.errors.0 }}</p>
    <p>{{ form.pwd.label }} {{ form.pwd }} {{ form.pwd.errors.0 }}</p>
    <input type="submit" value="提交">
    <!--用户名:<input type="text">-->
    <!--密码:<input type="password">-->
    <!--<input type="submit" value="提交">-->
</form>
</body>

前端页面效果:

(二)用户注册验证

py文件代码:

from flask import Flask,render_template,redirect,request
from wtforms import Form
from wtforms.fields import core
from wtforms.fields import html5
from wtforms.fields import simple
from wtforms import validators
from wtforms import widgets

app = Flask(__name__,template_folder="templates")
app.debug = True

=======================simple===========================
class RegisterForm(Form):
    name = simple.StringField(
        label="用户名",
        validators=[
            validators.DataRequired()
        ],
        widget=widgets.TextInput(),
        render_kw={"class":"form-control"},
        default="haiyan"
    )
    pwd = simple.PasswordField(
        label="密码",
        validators=[
            validators.DataRequired(message="密码不能为空")
        ]
    )
    pwd_confim = simple.PasswordField(
        label="重复密码",
        validators=[
            validators.DataRequired(message=‘重复密码不能为空.‘),
            validators.EqualTo(‘pwd‘,message="两次密码不一致")
        ],
        widget=widgets.PasswordInput(),
        render_kw={‘class‘: ‘form-control‘}
    )

  ========================html5============================
    email = html5.EmailField(  #注意这里用的是html5.EmailField
        label=‘邮箱‘,
        validators=[
            validators.DataRequired(message=‘邮箱不能为空.‘),
            validators.Email(message=‘邮箱格式错误‘)
        ],
        widget=widgets.TextInput(input_type=‘email‘),
        render_kw={‘class‘: ‘form-control‘}
    )

  ===================以下是用core来调用的=======================
    gender = core.RadioField(
        label="性别",
        choices=(
            (1,"男"),
            (1,"女"),
        ),
        coerce=int  #限制是int类型的
    )
    city = core.SelectField(
        label="城市",
        choices=(
            ("bj","北京"),
            ("sh","上海"),
        )
    )
    hobby = core.SelectMultipleField(
        label=‘爱好‘,
        choices=(
            (1, ‘篮球‘),
            (2, ‘足球‘),
        ),
        coerce=int
    )
    favor = core.SelectMultipleField(
        label="喜好",
        choices=(
            (1, ‘篮球‘),
            (2, ‘足球‘),
        ),
        widget = widgets.ListWidget(prefix_label=False),
        option_widget = widgets.CheckboxInput(),
        coerce = int,
        default = [1, 2]
    )

    def __init__(self,*args,**kwargs):  #这里的self是一个RegisterForm对象
        ‘‘‘重写__init__方法‘‘‘
        super(RegisterForm,self).__init__(*args, **kwargs)  #继承父类的init方法
        self.favor.choices =((1, ‘篮球‘), (2, ‘足球‘), (3, ‘羽毛球‘))  #吧RegisterForm这个类里面的favor重新赋值

    def validate_pwd_confim(self,field,):
        ‘‘‘
        自定义pwd_config字段规则,例:与pwd字段是否一致
        :param field:
        :return:
        ‘‘‘
        # 最开始初始化时,self.data中已经有所有的值
        if field.data != self.data[‘pwd‘]:
            # raise validators.ValidationError("密码不一致") # 继续后续验证
            raise validators.StopValidation("密码不一致")  # 不再继续后续验证

@app.route(‘/register‘,methods=["GET","POST"])
def register():
    if request.method=="GET":
        form = RegisterForm(data={‘gender‘: 1})  #默认是1,
        return render_template("register.html",form=form)
    else:
        form = RegisterForm(formdata=request.form)
        if form.validate():  #判断是否验证成功
            print(‘用户提交数据通过格式验证,提交的值为:‘, form.data)  #所有的正确信息
        else:
            print(form.errors)  #所有的错误信息
        return render_template(‘register.html‘, form=form)

if __name__ == ‘__main__‘:
    app.run()

register.html:

<body>
<h1>用户注册</h1>
<form method="post" novalidate style="padding:0  50px">
    {% for item in form %}
    <p>{{item.label}}: {{item}} {{item.errors[0] }}</p>
    {% endfor %}
    <input type="submit" value="提交">
</form>
</body>

前端页面效果:

原文地址:https://www.cnblogs.com/fengchong/p/10273742.html

时间: 2024-10-01 12:01:47

flask框架中使用wtforms的相关文章

Flask 框架中 上下文基础理念,包括cookie,session存储方法,requset属性,current_app模块和g模块

Flask中上下文,分为请求上下文和应用上下文.既状态留存 ,就是把变量存在某一个地方可以调用 请求上下文:实际就是request和session用法理念,既都是可以存储东西. 应用上下文:既变量共享,就是把东西存储在变量里可以打印预览,应用上下文包括 current_app模块和g模块 cookie方法增,查,删. 注:存储cookie时使用set_coooki方法存储key--calve形式数据,另一个参数max_age 是指定的存活时间. 调用cookie的方法是通过request模块的c

在flask框架中,对wtforms的SelectMultipleField的一个报错处理

先粘贴代码: form.py文件: users = SelectMultipleField( label="请选择用户", validators=[ DataRequired("请输入用户列表!") ], coerce=int, choices=[], description="权限列表", render_kw={ "class": "form-control" })views.py文件:部分代码: use

flask框架中SQLAlchemy相关

SQLAlchemy常用字段类型对照 类型名 python中类型 说明 Integer int 普通整数,一般是32位 SmallInteger int 取值范围小的整数,一般是16位 BigInteger int或long 不限制精度的整数 Float float 浮点数 Numeric decimal.Decimal 普通整数,一般是32位 String str 变长字符串 Text str 变长字符串,对较长或不限长度的字符串做了优化 Unicode unicode 变长Unicode字符

Flask框架知识点整合

Flask 0.Flask简介 Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收http请求并对请求进行预处理,然后触发Flask框架,开发人员基于Flask框架提供的功能对请求进行相应的处理,并返回给用户,如果要返回给用户复杂的内容时,需要借助jinja2模板来实现对模板的处理,即:将模板和数据进行渲染,将渲染后的字符串返回给用户浏览器. "微"(micro) 并不表示

Flask框架 之 信号

Flask框架中的信号基于blinker,其主要就是让开发者可是在flask请求过程中定制一些用户行为. 安装 pip3 install blinker 内置信号 request_started = _signals.signal('request-started') # 请求到来前执行 request_finished = _signals.signal('request-finished') # 请求结束后执行 before_render_template = _signals.signal

flask框架----信号

一.实例化补充 instance_path和instance_relative_config是配合来用的.这两个参数是用来找配置文件的,当用app.config.from_pyfile('settings.py')这种方式导入配置文件的时候会用到 from flask import Flask,request app = Flask(__name__,instance_path=None, instance_relative_config=True) app.config.from_pyfile

Flask 框架 重定向,捕获异常,钩子方法及使用jsonify在网页返回json数据

Flask 框架中常用到重定向方法来实现路由的跳转 ,路由跳转又分为站内跳转和站外跳转 常用的站内跳转方法为url_for  而常用的站外跳转为redirect 在这里提示一下: 在使用两种方法是须调用相对应的包: redirect对应的为redirect包  而url_for对应url_for 例: 具体代码为: 捕获异常:即在服务器没有相应的时候用来进行友好提示,提高用户体验 具体代码为: 钩子方法:分为第一次请求之前,每一次请求之前和请求之后在后台返回的数据 jsonify:在页面返回js

Flask框架基础3

目录 线程threading 通过字典实现threading-local(函数) 面向对象版 通过setattr和getattr实现 每个对象有自己的存储空间(字典) 兼容线程和协程(源码到request中去看,看local的__getattr__,setattr) 请求上下文 蓝图 使用蓝图之中小型系统 使用蓝图之大型系统 g对象 flask-session 信号 线程threading from threading import Thread from threading import lo

Flask框架之异常处理和请求钩子

异常处理 抛出异常 在Flask框架中,我们使用abort()方法,抛出异常信息. 代码如下: from flask import abort # 抛出异常 @app.route('/error') def error(): return abort(404) 捕获和处理异常 在Flask框架中,我们使用@app.errorhandler()装饰器,实现异常的捕获和处理. 代码如下: # 捕获异常 @app.errorhandler(404) def error_action(e): # 必须接