Flask框架從入門到精通之模板表單(二十)

〆 小源。發表於2019-05-04

知識點: 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>
複製程式碼

我們在瀏覽器除錯:

  • 不填任何引數 -
    在這裡插入圖片描述
  • 密碼不同

在這裡插入圖片描述

  • 全部正確

在這裡插入圖片描述
可以看到,利用Flask-WTF可以幫助我們快速校驗引數。 歡迎關注我的公眾號:

image

相關文章