Python Flask,Flask-WTF,表單驗證,CSRF驗證
阿新 • • 發佈:2019-01-01
使用Flask-WTF表單擴充套件,1、可以幫助進行CSRF驗證。2、幫助我們快速定義表單模板。3、而且可以幫助我們在檢視中驗證表單的資料
安裝Flask-WTF: pip install Flask-WTF
demo.py(Flask-WTF,定義表單模型類,定義檢視):
# coding:utf-8 from flask import Flask, render_template, redirect, url_for, session from flask_wtf import FlaskForm from wtforms import StringField, PasswordField, SubmitField # 匯入欄位型別 from wtforms.validators import DataRequired, EqualTo # 匯入驗證器 app = Flask(__name__) # CSRF_ENABLED是為了CSRF(跨站請求偽造)保護。 SECRET_KEY用來生成加密令牌,當CSRF啟用的時候,該設定會根據設定的密匙生成加密令牌。 app.config["SECRET_KEY"] = "xhosd6f982yfhowefy29f" # 使用Flask-WTF需要配置引數SECRET_KEY (csrf) # 定義表單的模型類 (一個類屬性對應表單一個input標籤) class RegisterForm(FlaskForm): """自定義的登錄檔單模型類""" # 在前端模板中可以通過label引數獲取該input標籤的說明資訊。 validators引數表示驗證器 # DataRequired 保證資料必須填寫,並且不能為空 user_name = StringField(label=u"使用者名稱", validators=[DataRequired(u"使用者名稱不能為空")]) # 通過validators來指定前端表單資料的校驗。 password = PasswordField(label=u"密碼", validators=[DataRequired(u"密碼不能為空")]) password2 = PasswordField(label=u"確認密碼", validators=[DataRequired(u"確認密碼不能為空"), EqualTo("password", u"兩次密碼不一致")]) submit = SubmitField(label=u"提交") @app.route("/show_register") def show_register(): # 建立表單物件。 form = RegisterForm() return render_template("register.html", form=form) # 將form模板變數分配給模板 @app.route("/register", methods=["POST"]) def register(): # 建立表單物件。 如果是post提交表單,flask會自動把表單資料封裝到form物件中 form = RegisterForm() # 驗證form中的資料(包括csrf驗證) # 如果form中的資料完全滿足所有的驗證器,則返回真,否則返回假 if form.validate_on_submit(): # 如果驗證通過 # 提取資料 uname = form.user_name.data pwd = form.password.data pwd2 = form.password2.data print(uname, pwd, pwd2) session["user_name"] = uname return redirect(url_for("index")) # 如果校驗未通過 return render_template("register.html", form=form) @app.route("/index") def index(): user_name = session.get("user_name", "") return "hello %s" % user_name if __name__ == '__main__': app.run(debug=True)
templates/register.html(模板):
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form method="post" action="/register"> {{ form.csrf_token }} <!-- 會自動校驗csrf --> {{ form.user_name.label }} <p>{{ form.user_name }}</p> {% for msg in form.user_name.errors %} <!-- 校驗失敗會將錯誤提示資訊儲存到errors中 --> <p>{{ msg }}</p> {% endfor %} {{ form.password.label }} <p>{{ form.password }}</p> {% for msg in form.password.errors %} <p>{{ msg }}</p> {% endfor %} {{ form.password2.label }} <p>{{ form.password2 }}</p> {% for msg in form.password2.errors %} <p>{{ msg }}</p> {% endfor %} {{ form.submit }} </form> </body> </html>