最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

flask中的wtforms使用方法

 更新時(shí)間:2018年07月21日 17:24:25   作者:海燕。  
這篇文章主要介紹了flask中的wtforms使用方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

一、簡單介紹flask中的wtforms

WTForms是一個(gè)支持多個(gè)web框架的form組件,主要用于對用戶請求數(shù)據(jù)進(jìn)行驗(yàn)證。

安裝:

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):
  '''自定義驗(yàn)證規(guī)則'''
  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"} #設(shè)置屬性
  )

  pwd = simple.PasswordField(
    label="密碼",
    validators=[
      validators.DataRequired(message="密碼不能為空"),
      validators.Length(max=8,min=3,message="密碼長度必須大于%(max)d且小于%(min)d"),
      validators.Regexp(regex="\d+",message="密碼必須是數(shù)字"),
    ],
    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("用戶提交的數(shù)據(jù)用過格式驗(yàn)證,值為:%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="重復(fù)密碼",
    validators=[
      validators.DataRequired(message='重復(fù)密碼不能為空.'),
      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來調(diào)用的=======================
  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是一個(gè)RegisterForm對象
    '''重寫__init__方法'''
    super(RegisterForm,self).__init__(*args, **kwargs) #繼承父類的init方法
    self.favor.choices =((1, '籃球'), (2, '足球'), (3, '羽毛球')) #吧RegisterForm這個(gè)類里面的favor重新賦值

  def validate_pwd_confim(self,field,):
    '''
    自定義pwd_config字段規(guī)則,例:與pwd字段是否一致
    :param field:
    :return:
    '''
    # 最開始初始化時(shí),self.data中已經(jīng)有所有的值
    if field.data != self.data['pwd']:
      # raise validators.ValidationError("密碼不一致") # 繼續(xù)后續(xù)驗(yàn)證
      raise validators.StopValidation("密碼不一致") # 不再繼續(xù)后續(xù)驗(yàn)證

@app.route('/register',methods=["GET","POST"])
def register():
  if request.method=="GET":
    form = RegisterForm(data={'gender': 1}) #默認(rèn)是1,
    return render_template("register.html",form=form)
  else:
    form = RegisterForm(formdata=request.form)
    if form.validate(): #判斷是否驗(yàn)證成功
      print('用戶提交數(shù)據(jù)通過格式驗(yàn)證,提交的值為:', 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標(biāo)簽
    csrf = True
    # 生成CSRF標(biāo)簽name
    csrf_field_name = 'csrf_token'

    # 自動生成標(biāo)簽的值,加密用的csrf_secret
    csrf_secret = 'xxxxxx'
    # 自動生成標(biāo)簽的值,加密用的csrf_context
    csrf_context = lambda x: request.url
    # 生成和比較csrf標(biāo)簽
    csrf_class = MyCSRF

    # -- i18n
    # 是否支持本地化
    # locales = False
    locales = ('zh', 'en')
    # 是否對本地化進(jìn)行緩存
    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()

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python如何使用27行代碼繪制星星圖

    Python如何使用27行代碼繪制星星圖

    這篇文章主要介紹了Python如何使用27行代碼繪制星星圖,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • python類繼承用法實(shí)例分析

    python類繼承用法實(shí)例分析

    這篇文章主要介紹了python類繼承用法實(shí)例分析,以實(shí)例的形式詳細(xì)講述了Python類繼承的實(shí)現(xiàn)方法及相關(guān)的工作原理,非常實(shí)用,需要的朋友可以參考下
    2014-10-10
  • ???????Python?入門學(xué)習(xí)之函數(shù)式編程

    ???????Python?入門學(xué)習(xí)之函數(shù)式編程

    這篇文章主要介紹了???????Python?入門學(xué)習(xí)之函數(shù)式編程,?Python?中的函數(shù)式編程技術(shù)進(jìn)行了簡單的入門介紹,下文詳細(xì)內(nèi)容需要的小伙伴可以參考一下
    2022-05-05
  • 如何使用python傳入不確定個(gè)數(shù)參數(shù)

    如何使用python傳入不確定個(gè)數(shù)參數(shù)

    這篇文章主要介紹了如何使用python傳入不確定個(gè)數(shù)參數(shù),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • python單鏈表實(shí)現(xiàn)代碼實(shí)例

    python單鏈表實(shí)現(xiàn)代碼實(shí)例

    這篇文章主要介紹了python單鏈表實(shí)現(xiàn)代碼,大家參考使用吧
    2013-11-11
  • 一次搞懂hasattr()/getattr()/setattr()在Python中的應(yīng)用

    一次搞懂hasattr()/getattr()/setattr()在Python中的應(yīng)用

    在Python中,hasattr()、getattr()和setattr()是一組內(nèi)置函數(shù),本文將從入門到精通,全面介紹hasattr()、getattr()和setattr()函數(shù)的用法和相關(guān)知識點(diǎn),需要的可以了解下
    2023-08-08
  • python中urllib.unquote亂碼的原因與解決方法

    python中urllib.unquote亂碼的原因與解決方法

    這篇文章主要給大家介紹了python中urllib.unquote亂碼的原因與解決方法,文中介紹的非常詳細(xì),對大家具有一定的參考價(jià)值,需要的朋友可以參考學(xué)習(xí),下面跟著小編一起來學(xué)習(xí)學(xué)習(xí)吧。
    2017-04-04
  • Python3+PyInstall+Sciter解決報(bào)錯缺少dll、html等文件問題

    Python3+PyInstall+Sciter解決報(bào)錯缺少dll、html等文件問題

    這篇文章主要介紹了Python3+PyInstall+Sciter解決報(bào)錯缺少dll、html等文件問題,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-07-07
  • python openpyxl方法 zip函數(shù)用法及說明

    python openpyxl方法 zip函數(shù)用法及說明

    這篇文章主要介紹了python openpyxl方法 zip函數(shù)用法及說明,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • 一篇文章搞懂Python反斜杠的相關(guān)問題

    一篇文章搞懂Python反斜杠的相關(guān)問題

    這篇文章主要給大家介紹了如何通過一篇文章搞懂Python反斜杠的相關(guān)問題,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03

最新評論

三门峡市| 宝清县| 扶沟县| 平遥县| 长寿区| 定陶县| 南城县| 沙河市| 库尔勒市| 怀安县| 宁远县| 苗栗县| 湘潭市| 江孜县| 海宁市| 青川县| 灵寿县| 卫辉市| 油尖旺区| 武川县| 安远县| 莱阳市| 北川| 沁水县| 无为县| 福建省| 仁寿县| 古蔺县| 南开区| 涞源县| 兴安县| 门头沟区| 格尔木市| 海晏县| 嘉禾县| 曲沃县| 会东县| 隆回县| 南宫市| 科技| 韶山市|