Flask入門—Flask-WTF表單驗證
阿新 • • 發佈:2019-01-06
1.原始的表單驗證
頁面程式碼:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form method="post">
<lable>使用者名稱:</lable><input type="text" name="username"><br>
<lable >密碼:</lable><input type="password" name="password"><br>
<label>確認密碼:</label><input type="password" name="password2"><br>
<input type="submit" value="提交"><br>
</form>
{# 使用遍歷獲取閃現的訊息 #}{% for message in get_flashed_messages() %} {{ message }}{% endfor %}
</body>
</html>
驗證程式碼:
# 表單 Flask-WTF擴充套件
'''
目的:實現一個簡單的登陸的邏輯處理
1.路由需要有get和post兩種請求方式 --> 需要判斷請求方式
2.獲取請求的引數(從表單中拿到資料)
3.判斷引數是否填寫,以及密碼是否相同
4.如果判斷都沒有問題,就返回一個success
'''
'''
給模板傳遞訊息
flash --> 需要對內容加密,因此需要設定secret_key,做加密訊息的混淆
模板中需要遍歷flash訊息
'''
from flask import Flask, render_template, request, flash
app = Flask(__name__)
app.secret_key = 'itheima'
@app.route('/', methods=['GET','POST'])
def index():
#request:請求物件 --> 獲取請求方式、資料
#1. 判斷請求方式
if request.method == 'POST':
# 2.獲取請求的引數 request(通過input中的name值)
username = request.form.get('username')
password = request.form.get('password')
password2 = request.form.get('password2')
print(username,password,password2)
# 3.判斷引數是否填寫&密碼是否相同(u是為了解決編碼問題)
if not all([username,password,password2]):
# print('引數不完整')
flash(u'引數不完整')
elif password != password2:
# print('密碼不一致')
flash(u'密碼不一致')
else:
return 'success'
return render_template('form.html')
if __name__ == '__main__':
app.run(debug=True)
2.Flask-WTF的表單驗證
WTForms常用驗證函式:
- DataRequireed 確保欄位中有資料
- EnqualTo 比較兩個欄位的值,常用於比較兩次密碼輸入
- Length 驗證輸入的欄位長度
- NumberRange 驗證輸入的值在數字範圍內
- URL 驗證URL
- AnyOf 驗證輸入值在可選列表中
- NoneOf 驗證輸入值不在可選列表中
使用Flask-WTF需要配置引數SECRET_KEY。
CSRF_ENABLED是為了CSRF(跨站請求偽造)保護。SECRET_KEY用來生成加密令牌,當CSRF啟用的時候,該設定會根據設定的金鑰生成加密令牌。
頁面程式碼:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form method="post">
{# 設定scrf_token #}
{{ form.csrf_token() }}{{ form.username.label }}{{ form.username }}<br>
{{ form.password.label }}{{ form.password }}<br>
{{ form.password2.label }}{{ form.password2 }}<br>
{{ form.submit }}
</form>
</body>
</html>
邏輯程式碼:
#coding=utf-8
#python3中的reload的使用
import importlib
from flask import Flask, render_template, request, flash
app = Flask(__name__)
# 匯入tf擴充套件的表單類
from flask_wtf import FlaskForm
#導 入自定義表單需要的欄位
from wtforms import SubmitField, StringField, PasswordField
#匯入wtf擴充套件提供的表單驗證
from wtforms.validators import DataRequired, EqualTo
# 解決編碼問題
import io,sys
# sys.stdout = io.TextIOWrapper(sys.stdout.detch(), encoding='utf-8')
# sys.stderr = ioTextIOWrapper(sys.stderr.detch(), encoding='utf-8')
# importlib.reload(sys)
# sys.set
# 自定義表單類、文字欄位、密碼欄位、提交按鈕
# 使用WTF實現表單 需要自定義一個表單類
class LoginForm(FlaskForm):
# StringField/PasswordField是區別文字框型別, 使用者名稱/密碼是指定label值, validators 就是指明要驗證哪些項
username = StringField('使用者名稱:', validators=[DataRequired()])
password = PasswordField('密碼:',validators=[DataRequired()])
password2 = PasswordField('確認密碼:', validators=[DataRequired(), EqualTo('password', '密碼填入的不一致')])
submit = SubmitField('提交')
# 定義根路由檢視函式,生成表單物件,獲取表單資料,進行表單資料驗證
@app.route('/form',methods=['GEt','POST'])
def login():
# 由RegisterForm類生成一個表例項
login_form = LoginForm()
# 邏輯處理
if request.method == 'POST':
# 獲取請求的引數
username = request.form.get('username')
password = request.form.get('password')
password2 = request.form.get('password2')
# 呼叫validation_on_submit方法,可以一次性執行完所有驗證函式的邏輯
if login_form.validate_on_submit():
# 進入這裡就表示所有的邏輯都驗證成功
print(username)
return 'success'
else:
#message = register_form.get('password2')[0]
#flash(message)
flash('引數有誤')
# 把例項化後的register_form傳入到頁面wtf.html中
return render_template('wtf.html',form=login_form)
@app.route('/')
def index():
return render_template('index.html')
if __name__ == '__mian__':
app.run()