flask中的wtforms使用方法
一、簡(jiǎn)單介紹flask中的wtforms
WTForms是一個(gè)支持多個(gè)web框架的form組件,主要用于對(duì)用戶請(qǐng)求數(shù)據(jù)進(jìn)行驗(yàn)證。
安裝:
pip3 install wtforms
二、簡(jiǎn)單使用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="用戶名長(zhǎng)度必須大于%(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="密碼長(zhǎng)度必須大于%(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,"錯(cuò)誤信息") 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、用戶注冊(cè)
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='郵箱格式錯(cuò)誤') ], 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對(duì)象 '''重寫__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) #所有的錯(cuò)誤信息 return render_template('register.html', form=form) if __name__ == '__main__': app.run()
register.html
<body> <h1>用戶注冊(cè)</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 # 是否自動(dòng)生成CSRF標(biāo)簽 csrf = True # 生成CSRF標(biāo)簽name csrf_field_name = 'csrf_token' # 自動(dòng)生成標(biāo)簽的值,加密用的csrf_secret csrf_secret = 'xxxxxx' # 自動(dòng)生成標(biāo)簽的值,加密用的csrf_context csrf_context = lambda x: request.url # 生成和比較csrf標(biāo)簽 csrf_class = MyCSRF # -- i18n # 是否支持本地化 # locales = False locales = ('zh', 'en') # 是否對(duì)本地化進(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()
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Python的Flask框架使用Redis做數(shù)據(jù)緩存的配置方法
- Python的Flask框架中SERVER_NAME域名項(xiàng)的配置教程
- Python的Flask框架中配置多個(gè)子域名的方法講解
- Python基于Flask框架配置依賴包信息的項(xiàng)目遷移部署
- Flask框架Flask-Principal基本用法實(shí)例分析
- Flask框架Flask-Login用法分析
- 詳解flask表單提交的兩種方式
- Python Web框架Flask下網(wǎng)站開發(fā)入門實(shí)例
- Python的Flask框架中@app.route的用法教程
- 30分鐘搭建Python的Flask框架并在上面編寫第一個(gè)應(yīng)用
- Flask框架配置與調(diào)試操作示例
相關(guān)文章
python實(shí)現(xiàn)linux下抓包并存庫功能
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)linux下抓包并存庫功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-07-07Python響應(yīng)對(duì)象text屬性亂碼解決方案
這篇文章主要介紹了Python響應(yīng)對(duì)象text屬性亂碼解決方案,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03python之json文件轉(zhuǎn)xml文件案例講解
這篇文章主要介紹了python之json文件轉(zhuǎn)xml文件案例講解,本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08python實(shí)現(xiàn)控制電腦鼠標(biāo)和鍵盤,登錄QQ的方法示例
這篇文章主要介紹了python實(shí)現(xiàn)控制電腦鼠標(biāo)和鍵盤,登錄QQ的方法,涉及Python基于Button,Controller,Key模塊針對(duì)鍵盤、鼠標(biāo)的控制相關(guān)操作技巧,需要的朋友可以參考下2019-07-07解決tensorflow打印tensor有省略號(hào)的問題
今天小編就為大家分享一篇解決tensorflow打印tensor有省略號(hào)的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-02-02Python語法學(xué)習(xí)之線程的創(chuàng)建與常用方法詳解
本文主要介紹了線程的使用,線程是利用進(jìn)程的資源來執(zhí)行業(yè)務(wù),并且通過創(chuàng)建多個(gè)線程,對(duì)于資源的消耗相對(duì)來說會(huì)比較低,今天就來看一看線程的使用方法具體有哪些吧2022-04-04