1. 程式人生 > >Python Flask,Flask-WTF,表單驗證,CSRF驗證

Python Flask,Flask-WTF,表單驗證,CSRF驗證

使用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>