flask13-WTF表單
Web 表單是 Web 應用程序的基本功能。
它是HTML頁面中負責數據採集的部件。表單有三個部分組成:表單標籤、表單域、表單按鈕。表單允許用戶輸入數據,負責HTML頁面數據採集,通過表單將用戶輸入的數據提交給服務器。
在Flask中,爲了處理web表單,我們可以使用 Flask-WTF 擴展,它封裝了 WTForms,並且它有驗證表單數據的功能
WTForms支持的HTML標準字段
字段對象 |
說明 |
StringField |
文本字段 |
TextAreaField |
多行文本字段 |
PasswordField |
密碼文本字段 |
HiddenField |
隱藏文件字段 |
DateField |
文本字段,值爲 datetime.date 文本格式 |
DateTimeField |
文本字段,值爲 datetime.datetime 文本格式 |
IntegerField |
文本字段,值爲整數 |
DecimalField |
文本字段,值爲decimal.Decimal |
FloatField |
文本字段,值爲浮點數 |
BooleanField |
複選框,值爲True 和 False |
RadioField |
一組單選框 |
SelectField |
下拉列表 |
SelectMutipleField |
下拉列表,可選擇多個值 |
FileField |
文件上傳字段 |
SubmitField |
表單提交按鈕 |
FormField |
把表單作爲字段嵌入另一個表單 |
FieldList |
一組指定類型的字段 |
WTForms常用驗證函數
驗證函數 |
說明 |
DataRequired |
確保字段中有數據 |
EqualTo |
比較兩個字段的值,常用於比較兩次密碼輸入 |
Length |
驗證輸入的字符串長度 |
NumberRange |
驗證輸入的值在數字範圍內 |
URL |
驗證URL |
AnyOf |
驗證輸入值在可選列表中 |
NoneOf |
驗證輸入值不在可選列表中 |
使用 Flask-WTF 需要配置參數 SECRET_KEY。
CSRF_ENABLED是爲了CSRF(跨站請求僞造)保護。 SECRET_KEY用來生成加密令牌,當CSRF激活的時候,該設置會根據設置的密匙生成加密令牌。
from flask import Flask, render_template, request, flash
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField
from wtforms.validators import DataRequired, EqualTo
app = Flask(__name__)
app.secret_key = 'bvdhkbdvskhbvdsh' # 這個值隨意輸入
'''
/根節點是普通表單、 demo1是WTF表單,使用兩種表單提交,驗證其過程以及閃現消息的捕獲。
'''
# 表單類
class RegisterForm(FlaskForm):
username = StringField('用戶名:', validators=[DataRequired()])
password = PasswordField('密碼:', validators=[DataRequired()])
password2 = PasswordField('確認密碼:', validators=[DataRequired(), EqualTo('password', '密碼填入的不一致')])
submit = SubmitField('提交')
@app.route('/demo1', methods=["get", "post"])
def demo1():
regist_form = RegisterForm()
if regist_form.validate_on_submit(): # 內置校驗,關聯RegisterForm類中的validators屬性的所有驗證
# 1. 取到註冊所對應的數據
username = request.form.get("username")
password = request.form.get("password")
password2 = request.form.get('password2')
# 2. 執行註冊操作
print("%s %s %s" % (username, password, password2))
return "註冊成功"
else:
if request.method == 'POST':
return '獲得post請求'
return render_template('html/04-tempWTF.html', form=regist_form)
@app.route('/', methods=['GET', 'POST'])
def get_form():
if request.method == 'POST':
username = request.form.get('username')
password = request.form.get('password')
refirmpwd = request.form.get('refirmpwd')
print(username)
if not all([username, password, refirmpwd]):
flash('參數不完整')
elif password != refirmpwd:
flash('密碼不一致')
else:
return 'success'
return render_template('html/02-form.html')
if __name__ == '__main__':
app.run(debug=True)
02-form.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>form</title>
</head>
<body>
<form method="POST">
<lable>用 戶 名:</lable><input type="text" name="username">
<lable>密 碼:</lable><input type="password" name="password">
<lable>確認密碼:</lable><input type="password" name="refirmpwd">
<input type="submit" value="提交">
<hr>
{#使用遍歷獲取閃現的消息#}
{% for message in get_flashed_messages() %}
{{ message }}
{% endfor %}
</form>
</body>
</html>
04-tempWTF.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>WTF</title>
</head>
<body>
<form method="post">
{{ form.csrf_token() }}
{{ form.username.label }}{{ form.username }}
{{ form.password.label }}{{ form.password }}
{{ form.password2.label }}{{ form.password2 }}
{{ form.submit }}
</form>
<hr>
</body>
</html>