知識點: 1、WTF使用
一、概況
當前端使用form表單進行引數傳遞時候,前端一般都會用js來校驗使用者輸入的引數是否合法。作為後端,不能依賴前端的校驗。要在前端校驗的基礎上在進行一遍校驗,防止程式出現異常。 當引數過多時,我們要對每個引數都進行校驗,顯得非常麻煩。在Flask中我們可以用Flask-WTF幫助我們快速校驗。Flask-WTF是整合WTForms,並帶有 csrf 令牌的安全表單和全域性的 csrf 保護的功能。
二、WTForms支援的HTML標準欄位
欄位 | 說明 |
---|---|
StringField | 文字欄位 |
TextAreaField | 多行文字欄位 |
PasswordField | 密碼文字欄位 |
HiddenField | 隱藏文字欄位 |
DateField | 文字欄位,值為datetime.date格式 |
DateTimeField | 文字欄位,值為datetime.datetime格式 |
IntegerField | 文字欄位,值為整數 |
DecimalField | 文字欄位,值為decimal.Decimal |
FloatField | 文字欄位,值為浮點數 |
BooleanField | 核取方塊,值為True和False |
RadioField | 一組單選框 |
SelectField | 下拉選單 |
SelectMultipleField | 下拉選單,可選擇多個值 |
FileField | 文字上傳欄位 |
SubmitField | 表單提交按鈕 |
FormField | 把表單作為欄位嵌入另一個表單 |
FieldList | 一組指定型別的欄位 |
三、WTForms常用驗證函式
函式 | 說明 |
---|---|
DataRequired | 確保欄位中有資料 |
EqualTo | 比較兩個欄位的值,常用於比較兩次密碼輸入 |
Length | 驗證輸入的字串長度 |
NumberRange | 驗證輸入的值在數字範圍內 |
URL | 驗證URL |
AnyOf | 驗證輸入值在可選列表中 |
NoneOf | 驗證輸入值不在可選列表中 |
使用Flask-WTF需要配置引數SECRET_KEY。
CSRF_ENABLED是為了CSRF(跨站請求偽造)保護。 SECRET_KEY用來生成加密令牌,當CSRF啟用的時候,該設定會根據設定的密匙生成加密令牌。
在HTML頁面中直接寫form表單:
#模板檔案
<form method='post'>
<input type="text" name="username" placeholder='Username'>
<input type="password" name="password" placeholder='password'>
<input type="submit">
</form>
複製程式碼
檢視函式中獲取表單資料:
from flask import Flask,render_template,request
@app.route('/login',methods=['GET','POST'])
def login():
if request.method == 'POST':
username = request.form['username']
password = request.form['password']
print username,password
return render_template('login.html',method=request.method)
複製程式碼
使用Flask-WTF實現表單。
配置引數:
app.config['SECRET_KEY'] = 'python is good'
複製程式碼
檢視函式:
from flask import Flask, render_template, redirect, url_for, session, request, flash
# 匯入wtf擴充套件的表單類
from flask_wtf import FlaskForm
# 匯入自定義表單需要的欄位
from wtforms import SubmitField, StringField, PasswordField
# 匯入wtf擴充套件提供的表單驗證器
from wtforms.validators import DataRequired, EqualTo
app = Flask(__name__)
app.config['SECRET_KEY'] = 'python is good'
# 自定義表單類,文字欄位、密碼欄位、提交按鈕
class Login(FlaskForm):
name = StringField(label='使用者:', validators=[DataRequired('使用者名稱不能為空')])
pwd = PasswordField(label='密碼', validators=[DataRequired('密碼不能為空'), EqualTo('pwd1', '密碼不一樣')])
pwd1 = PasswordField(label='確認密碼', validators=[DataRequired('密碼不能為空')])
submit = SubmitField('提交')
@app.route('/login')
def login():
return render_template('login.html')
# 定義根路由檢視函式,生成表單物件,獲取表單資料,進行表單資料驗證
@app.route('/', methods=['GET', 'POST'])
def index():
form = Login()
if form.validate_on_submit():
name = form.name.data
pwd = form.pwd.data
pwd1 = form.pwd1.data
print(name, pwd, pwd1)
return redirect(url_for('login'))
return render_template('index.html', form=form)
if __name__ == '__main__':
app.run(debug=True)
複製程式碼
模板頁面:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form method="post">
<!--設定csrf_token-->
{{ form.csrf_token() }}
{{ form.name.label }}
<p>{{ form.name }}</p>
{% for msg in form.name.errors %}
<p>{{ msg }}</p>
{% endfor %}
{{ form.pwd.label }}
<p>{{ form.pwd }}</p>
{% for msg in form.pwd.errors %}
<p>{{ msg }}</p>
{% endfor %}
{{ form.pwd1.label }}
<p>{{ form.pwd1 }}</p>
{% for msg in form.pwd1.errors %}
<p>{{ msg }}</p>
{% endfor %}
<p>{{ form.submit() }}</p>
{% for x in get_flashed_messages() %}
{{ x }}
{% endfor %}
</form>
</body>
</html>
複製程式碼
我們在瀏覽器除錯:
- 不填任何引數 -
- 密碼不同
- 全部正確