Flask 【第七篇】Flask中的wtforms使用

一、簡單介紹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 = messagedef __call__(self, form, field):print(field.data,"用戶輸入的信息")if field.data == "haiyan":return Noneraise 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 widgetsapp = 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.EmailFieldlabel='郵箱',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 md5app = Flask(__name__, template_folder='templates')
app.debug = Trueclass MyCSRF(CSRF):"""Generate a CSRF token based on the user's IP. I am probably not verysecure, so don't use me."""def setup_form(self, form):self.csrf_context = form.meta.csrf_context()self.csrf_secret = form.meta.csrf_secretreturn super(MyCSRF, self).setup_form(form)def generate_csrf_token(self, csrf_token):gid = self.csrf_secret + self.csrf_contexttoken = md5(gid.encode('utf-8')).hexdigest()return tokendef 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標簽namecsrf_field_name = 'csrf_token'# 自動生成標簽的值,加密用的csrf_secretcsrf_secret = 'xxxxxx'# 自動生成標簽的值,加密用的csrf_contextcsrf_context = lambda x: request.url# 生成和比較csrf標簽csrf_class = MyCSRF# -- i18n# 是否支持本地化# locales = Falselocales = ('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()

?

?

轉載于:https://www.cnblogs.com/xiaohema/p/8456741.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/281195.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/281195.shtml
英文地址,請注明出處:http://en.pswp.cn/news/281195.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

CSS自定義滾動條樣式

css通過滾動條偽類來修改滾動條樣式&#xff0c;偽類名稱如下 ::-webkit-scrollbar 滾動條整體部分 ::-webkit-scrollbar-track 滾動條軌道&#xff08;里面裝有滑塊 thumb&#xff09; ::-webkit-scrollbar-thumb 滾動條滑塊 ::-webkit-scrollbar-button 滾動條軌道兩端按鈕 …

為了避免內存攻擊,美國國家安全局提倡Rust、C#、Go、Java、Ruby 和 Swift,但將 C 和 C++ 置于一邊...

本文翻譯自兩篇文章&#xff0c;第一篇是對美國國家安全局在“軟件內存安全”網絡安全信息表的解讀&#xff0c;第二篇是普及什么是內存安全&#xff0c;為什么它很重要&#xff1f;第一篇 為了避免內存攻擊&#xff0c;美國國家安全局提倡Rust、C#、Go、Java、Ruby 和 Swift&a…

自學python(一)

一、入門儀式 學習一門新語言必不可少的一件事&#xff1a; print("Hello world!")二、基礎知識 1、注釋&#xff1a; 單行注釋&#xff1a; 1 print("Hello world!") #輸出Hello world! 多行注釋&#xff1a; 這是多行注釋 這是多行注釋 這是多行注釋…

.NET周報【11月第2期 2022-11-15】

國內文章統一的開發平臺.NET 7正式發布https://www.cnblogs.com/shanyou/archive/2022/11/09/16871945.html在 2020 年規劃的.NET 5功能終于在.NET 7 完成了&#xff0c;為微軟和社區一起為多年來將不同的開發產品統一起來的努力加冕&#xff0c;未來只有一個.NET, 回顧.NET 20…

如何像使用AspNetCore中的Controllers 和 Actions一樣處理MQTT消息

在物聯網項目中&#xff0c; 處理MQTT的topic時費工費力&#xff0c; 代碼一團亂&#xff0c; 什么才是最好的姿勢&#xff1f;這里面我們極力介紹 MQTTnet.AspNetCore.Routing 項目&#xff0c;MQTTnet AspNetCore Routing 是https://github.com/Atlas-LiftTech/MQTTnet.AspN…

chrome 懸停大圖插件_Google Chrome瀏覽器的懸停卡:我不想要的我最喜歡的新東西

chrome 懸停大圖插件If you only have a handful of open tabs in Google Chrome, it’s easy to tell what they are. But as you start to collect more tabs (or make the window smaller), it gets harder. That’s where Hover Cards come in. 如果您在Google Chrome瀏覽器…

GitHub Codespaces 安裝 .NET 7

本文主要介紹如何在 GitHub Codespaces 這個云上 IDE 環境中安裝 .NET 7背景GitHub 的 Codespaces 可以讓我們隨時隨地編寫代碼&#xff0c;一些簡單的修改也非常方便快捷。特別是 .NET 7 發布后&#xff0c;一些可以直接升級的小項目只需要更改配置就可以了&#xff0c;我們可…

chrome怎么隱藏瀏覽器_如何使用Google Chrome的隱藏閱讀器模式

chrome怎么隱藏瀏覽器Chrome 75 has a hidden “Reader” mode that strips web pages down to the bare minimum to make them easier to, well, read. But it’s not enabled by default—here’s how to get it now. Chrome 75具有隱藏的“閱讀器”模式&#xff0c;可將網頁…

angularjs中使用swiper時不起作用,最后出現空白位

controller.js中定義swipers指令&#xff1a; var moduleCtrl angular.module(newscontroller,[infinite-scroll,ngTouch,news.service]) .directive(swipers,swipers); swipers.$inject [$timeout]; function swipers($timeout) {return {restrict: "EA",scope: {…

使用Jupyter記事本記錄和制作.NET可視化筆記

前言&#xff1a;對于記錄筆記的工具特別多&#xff0c;不過對于程序員來說&#xff0c;記錄筆記程序代碼運行結果演示可以同時存在&#xff0c;無疑會極大增加我們的筆記的可讀性和體驗感。以前在寫python的時候&#xff0c;使用jupyter的體驗很好&#xff0c;所以此處做一個基…

火狐上如何使用谷歌翻譯插件_將Google翻譯功能添加到Firefox

火狐上如何使用谷歌翻譯插件Are you looking for a quick no-fuss way to translate webpages? Then you will want to take a good look at the Translate extension for Firefox. 您是否正在尋找一種快速簡便的方法來翻譯網頁&#xff1f; 然后&#xff0c;您將需要很好地了…

Android 4.X 系統加載 so 失敗的原因分析

1 so 加載過程 so 加載的過程可以參考小米的系統工程師的文章loadLibrary動態庫加載過程分析 2 問題分析 2.1 問題 年前項目里新加了一個 so庫&#xff0c;但發現native 方法的找不到的 crash 好多&#xff0c;好些都是報了java.lang.unsatisfiedlinkerror native method not f…

桌面顯示激活windows_愚蠢的怪胎技巧:如何在桌面上顯示Windows版本

桌面顯示激活windowsHave you ever noticed during all the beta releases of Windows, there’s always a Windows version on the desktop in the lower right-hand corner? Here’s how that “feature” is enabled or disabled. 您是否曾經在Windows的所有beta版本中都注…

服務網格:限流保護 (上)

背景限流是服務治理中保護服務的重要手段之一&#xff0c;也是最直接有效的手段&#xff0c;它可以保護服務不被瞬間的大流量沖垮&#xff0c;類似電路中的“保險絲”。在服務上線前&#xff0c;我們都會對服務進行基準測試&#xff0c;來了解可通過的最大“電流”。上面所說的…

博弈論進階之Anti-SG游戲與SJ定理

前言 在上一節中&#xff0c;我們初步了解了一下SG函數與SG定理。 今天我們來分析一下SG游戲的變式——Anti-SG游戲以及它所對應的SG定理 首先從最基本的Anti-Nim游戲開始 Anti-Nim游戲是這樣的 有兩個頂尖聰明的人在玩游戲&#xff0c;游戲規則是這樣的&#xff1a; 有\(n\)堆…

怎樣取消outlook約會_快速提示:在Outlook 2010中設置和取消約會

怎樣取消outlook約會Getting everyone in one place at the same time for appointments can be daunting at times. Outlook makes it easy to setup appointments and invite attendees as well, and here we look at doing it in Outlook 2010. 同時讓每個人都集中在一個地方…

重視和解決 ABP 分布式事件亂序問題

ABP Framework 5.0 實現了單體應用場景下&#xff0c;收件箱和發件箱的事件嚴格順序性。但在微服務或多數據庫場景下&#xff0c;由于網絡時延和設施效率的限制&#xff0c; 分布式事件將不再是 Linearizability [1] 的&#xff0c;因此必然會存在物理時間上的收件亂序。借用 D…

個人博客建站方案推薦

1.服務器選擇 正值雙十一來臨之際各大服務器提供商又大量的優惠活動&#xff0c;各位要步入個人站長行列的小哥們時機要把握好了&#xff0c;我個人使用過阿里云的服務器&#xff0c;騰訊云的服務器&#xff0c;華為云的服務器。其實&#xff0c;個人感覺就放個博客&#xff0c…

linux系統下nginx安裝目錄和nginx.conf配置文件目錄

linux系統下nginx安裝目錄和nginx.conf配置文件目錄 1、查看nginx安裝目錄 輸入命令 # ps -ef | grep nginx 返回結果包含安裝目錄 root 2662 1 0 07:12 ? 00:00:00 nginx: master process /usr/sbin/nginx 2、查看nginx.conf配置文件目錄 輸入命令 # nginx…

android啟用hdcp_如何在Android上啟用優先收件箱(和設置僅重要通知)

android啟用hdcpYesterday Google released an updated Gmail application for Android 2.2 phones that supports the Priority Inbox feature—and more importantly, allows you to change your notifications to only alert you for important email. Let’s take a look. …