1. 程式人生 > >Flask入門—Flask-WTF表單驗證

Flask入門—Flask-WTF表單驗證

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()