亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

flask中的wtforms使用方法

發布時間:2020-09-18 20:46:32 來源:腳本之家 閱讀:177 作者:海燕。 欄目:開發技術

一、簡單介紹flask中的wtforms

WTForms是一個支持多個web框架的form組件,主要用于對用戶請求數據進行驗證。

安裝:

pip3 install wtforms

二、簡單使用wtforms組件

1、用戶登錄

flask中的wtforms使用方法

具體代碼:

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、用戶注冊

flask中的wtforms使用方法

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>
<h2>用戶注冊</h2>
<form method="post" novalidate >
  {% 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()

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

沂南县| 河池市| 桦南县| 洪泽县| 古交市| 丹巴县| 秦安县| 南安市| 宜兰市| 兴和县| 台中市| 乌拉特中旗| 通辽市| 临澧县| 长垣县| 栖霞市| 中牟县| 威远县| 滕州市| 丽水市| 任丘市| 新竹市| 东港市| 永安市| 景德镇市| 大理市| 通州区| 盖州市| 丰城市| 绥宁县| 永福县| 祁东县| 横峰县| 垣曲县| 西吉县| 观塘区| 金沙县| 石台县| 呼伦贝尔市| 图们市| 延寿县|