flask第七篇flask中的wtforms使用

呆萌小河马的博客 呆萌小河马的博客     2022-10-16     689

关键词:

一、简单介绍flask中的wtforms

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

安装:

pip3 install wtforms

二、简单使用wtforms组件

1、用户登录

具体代码:

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.__call__()
    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>

2、用户注册

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>

 3、meta

#!/usr/bin/env python
# -*- coding:utf-8 -*-
from flask import Flask, render_template, request, redirect, session
from wtforms import Form
from wtforms.csrf.core import CSRF
from wtforms.fields import core
from wtforms.fields import html5
from wtforms.fields import simple
from wtforms import validators
from wtforms import widgets
from hashlib import md5

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


class MyCSRF(CSRF):
    """
    Generate a CSRF token based on the user's IP. I am probably not very
    secure, so don't use me.
    """

    def setup_form(self, form):
        self.csrf_context = form.meta.csrf_context()
        self.csrf_secret = form.meta.csrf_secret
        return super(MyCSRF, self).setup_form(form)

    def generate_csrf_token(self, csrf_token):
        gid = self.csrf_secret + self.csrf_context
        token = md5(gid.encode('utf-8')).hexdigest()
        return token

    def validate_csrf_token(self, form, field):
        print(field.data, field.current_token)
        if field.data != field.current_token:
            raise ValueError('Invalid CSRF')


class TestForm(Form):
    name = html5.EmailField(label='用户名')
    pwd = simple.StringField(label='密码')

    class Meta:
        # -- CSRF
        # 是否自动生成CSRF标签
        csrf = True
        # 生成CSRF标签name
        csrf_field_name = 'csrf_token'

        # 自动生成标签的值,加密用的csrf_secret
        csrf_secret = 'xxxxxx'
        # 自动生成标签的值,加密用的csrf_context
        csrf_context = lambda x: request.url
        # 生成和比较csrf标签
        csrf_class = MyCSRF

        # -- i18n
        # 是否支持本地化
        # locales = False
        locales = ('zh', 'en')
        # 是否对本地化进行缓存
        cache_translations = True
        # 保存本地化缓存信息的字段
        translations_cache = {}


@app.route('/index/', methods=['GET', 'POST'])
def index():
    if request.method == 'GET':
        form = TestForm()
    else:
        form = TestForm(formdata=request.form)
        if form.validate():
            print(form)
    return render_template('index.html', form=form)


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

 

 

 
 

flask中的wtforms使用(代码片段)

一、简单介绍flask中的wtformsWTForms是一个支持多个web框架的form组件,主要用于对用户请求数据进行验证。安装:pip3installwtforms二、简单使用wtforms组件1、用户登录具体代码:fromflaskimportFlask,render_template,request,redirectfromwtforms.fieldsimp... 查看详情

flask学习第7篇:flask中的wtforms使用(代码片段)

flask中的wtforms使用一、简单介绍flask中的wtformsWTForms是一个支持多个web框架的form组件,主要用于对用户请求数据进行验证。安装:pip3installwtforms二、简单使用wtforms组件1、用户登录具体代码:fromflaskimportFlask,render_template,request,redir... 查看详情

使用flask和WTForms在一个页面中的多个表单

】使用flask和WTForms在一个页面中的多个表单【英文标题】:MultipleformsinasinglepageusingflaskandWTForms【发布时间】:2013-08-1920:28:52【问题描述】:我在同一页面上有多个表单将发布请求发送到同一处理程序在烧瓶中。我正在使用wtforms... 查看详情

85flask之wtforms

...件的使用自定义From组件 一、wtforms组件的使用1、flask中的wtformsWTForms是一个支持多个web框架的form组件,主要用于对用户请求数据进行验证。安装:pip3installwtforms2、wtforms组件的使用之登录验证1)图示2)manage.pyfromflaskimportFlask,... 查看详情

wtformsinflask(wtforms在flask中的应用)(代码片段)

WTFormsWTForms是一个支持多个web框架的form组件,主要用于对用户请求数据进行验证。安装wtforms:pip3/pipinstallwtforms 用户登录/注册示例项目目录结构flask-wtforms-example│app.py│└─templatesadd_user.htmlindex.htmllogin.htmlregister.htmlusers.html& 查看详情

如何在带有 FormField 的 Flask / WTForms 中使用 populate_obj?

...个有位置的用户。正如概念证明一样,Location是CombinedForm中的一个FormField,应该存储为UserModel。最终我想要有相当多的嵌套表单,所 查看详情

flask-flask-script|多app应用|wtforms

flask-script用于实现类似于django中python3manage.pyrunserver...类似的命令安装>:pip3installflask-script使用manage.pyfromflaskimportFlask#1.导入Managerfromflask_scriptimportManager#2.实例化Flask生成对象appapp=Flask(__name__)#3 查看详情

wtforms快速使用和源码分析(基于flask)

wtforms和django的form组件大同小异,下面给出一个应用举例以便快速查询。开始使用1fromflaskimportFlask,render_template,request,redirect23fromwtformsimportForm45fromwtforms.fieldsimportcore6fromwtforms.fieldsimporthtml57fromwtforms.fie 查看详情

flask-wtforms(代码片段)

...过form.errors来获取具体的错误信息示例代码如下RegistForm类中的代码 查看详情

如何通过 AJAX 使用 Flask-WTForms CSRF 保护?

】如何通过AJAX使用Flask-WTFormsCSRF保护?【英文标题】:HowtouseFlask-WTFormsCSRFprotectionwithAJAX?【发布时间】:2015-10-3112:33:39【问题描述】:Flask-WTForms提供CSRF保护。它在使用普通HTML表单时效果很好,但在使用AJAX时过程不太清楚。我的... 查看详情

使用 Flask-WTForms,如何设置 html 表单部分的样式?

】使用Flask-WTForms,如何设置html表单部分的样式?【英文标题】:UsingFlask-WTForms,howdoIstylemyformsectionofthehtml?【发布时间】:2016-04-1618:04:56【问题描述】:我阅读了Flask-WTF极其简化的wiki,但对我能用它做什么并不太了解。我的印象... 查看详情

使用 WTForms 字段列表

】使用WTForms字段列表【英文标题】:WorkingwithWTFormsFieldList【发布时间】:2011-08-2510:17:22【问题描述】:我通过Flask.WTF扩展将WTForms与Flask一起使用。不过,这个问题不是Flask特有的。WTForms包含一个FieldListfieldforlistsoffields。我想用... 查看详情

自动完成 Flask wtforms

】自动完成Flaskwtforms【英文标题】:AutocompleteFlaskwtforms【发布时间】:2021-03-0413:59:44【问题描述】:我想使用数量和商品价格自动更新我的总金额字段?有没有办法使用没有javascript的烧瓶来做到这一点?我希望在输入数量和商... 查看详情

flask:flask-script;多app应用;wtforms;sqlchmy

一. flask-script一.flask-script简介1.什么是flask-script:是一个让你的命令行支持自定义命令的工具,它为Flask程序添加一个命令行解释器。可以让我们的程序从命令行直接执行相应的程序(用于实现类似于django中python3manage.pyrunserver...... 查看详情

flask之wtforms源码分析

...到cls._wtforms_meta中32.执行构造方法45a.循环cls._unbound_fields中的字段,并执行字段的bind方法,然后将返回值添加到self._fields[name]中。6即:7_fields={8 查看详情

flask之wtform与flask-session组件

1.wtformfromflaskimportFlask,render_template,request,redirectfromwtformsimportFormfromwtforms.fieldsimportcorefromwtforms.fieldsimporthtml5fromwtforms.fieldsimportsimplefromwtformsimportvalidatorsfrom 查看详情

当我将 POST 与 Flask 一起使用时,我遇到了 wtforms 选择字段的问题

】当我将POST与Flask一起使用时,我遇到了wtforms选择字段的问题【英文标题】:I\'mhavingproblemswithwtformsselectfieldswheniuseaPOSTwithFlask【发布时间】:2013-04-0222:31:44【问题描述】:我对wtforms和烧瓶还很陌生,并且在使用selectfields时遇到... 查看详情

Flask WTForms:DataRequired 和 InputRequired 之间的区别

...布时间】:2014-07-2121:14:45【问题描述】:wtforms.valiadators中的DataRequired和InputRequired有什么区别我的注册表单中有一些字段:usernamepassw 查看详情