目录:
【Flask学习笔记:一】开发环境部署
【Flask学习笔记:二】Flask 入门基础知识
【Flask学习笔记:三】Flask 中的 request、response
【Flask学习笔记:四】Flask 应用和请求上下文
【Flask学习笔记:五】Jinja2 模板引擎
【Flask学习笔记:六】Flask 蓝图
【Flask学习笔记:七】Flask - WTF 处理表单
【Flask学习笔记:八】Flask 中的 cookie、session
【Flask学习笔记:九】Flask-SQLAlchemy
【Flask学习笔记:七】Flask - WTF 处理表单
一、Flask-WTF 安装
用 pip 安装 Flask-WTF 是十分简单的:
$ pip install Flask-WTF
或者使用 anaconda 安装:
conda install flask-wtf
二、WTForms支持的常用HTML标准字段
| 字段类型 | 说明 |
|---|---|
| StringField | 文本字段 |
| IntegerField | 文本字段,值为整数 |
| PasswordField | 密码文本字段 |
| BooleanField | 复选框,值为 True 和 False |
| FileField | 文件上传字段 |
| RadioField | 一组单选按钮 |
| SelectField | 下拉列表 |
| DateField | 文本字段,值为 datetime.data 格式 |
| DateTimeField | 文本字段,值为 datetime.datetime 格式 |
三、WTForms常用验证函数
| 验证函数 | 说明 |
|---|---|
| DataRequired | 确保该字段有数值 |
| 验证电子邮件地址 | |
| Length | 验证输入字符串的长度 |
| NumberRange | 验证输入的值在数字范围之内 |
| Regexp | 使用正则表达式验证输入值 |
四、CSRF 保护
Flask-WTF 提供了对所有 Form 表单免受跨站请求伪造 ( Cross-Site Request Forgery ,CSRF) 攻击的技术支持 (通过添加动态 token 令牌的方式)。
如果要启用 CSRF 保护,可以在 config.py 中定义两个变量:
CSRF_ENABLED = True
SECRET_KEY = os.urandom(24)
其中,SECRET_KEY 用来建立加密的令牌,用于验证 Form 表单提交,尽可能设置的复杂一些,这样恶意攻击者将很难才到密钥值。
五、简单应用
编写loginForms.py文件, 定义一个关于表单的类:
from flask_wtf import Form
from wtforms import StringField, PasswordField
from wtforms.validators import DataRequired, Length
class LoginForms(Form):
username = StringField('username:', validators=[DataRequired(message='用户名不能为空'),
Length(min=6, max=20, message='长度位于6-20之间')],
render_kw={'placeholder': '输入用户名'})
password = PasswordField('password:', validators=[DataRequired(message='密码不能为空'),
Length(min=6, max=20, message='长度位于6-20之间')],
render_kw={'placeholder': '输入密码'})
def validate_username(self, field): # 自定义验证函数
print("自定义验证函数-username")
username = field.data
print(username)
if username == '123456':
raise ValidationError("用户不存在")
在 demo.py 中使用创建的 LoginForms:
from flask import Flask, render_template, url_for
from flask_wtf import CSRFProtect
from werkzeug.utils import redirect
import config
from app.forms.loginForms import LoginForms
app = Flask(__name__)
app.config.from_object(config) # 配置文件初始化
CSRFProtect(app) # CSRFProtect 模块初始化
@app.route('/')
def index():
return redirect(url_for('login'))
@app.route('/login', methods=['GET', 'POST'])
def login():
form = LoginForms()
if form.validate_on_submit():
return render_template('home.html')
else:
return render_template('login.html', form=form)
if __name__ == '__main__':
app.run(port=8080)
login.html 文件:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}" />
</head>
<body>
<div class="container">
<span>登录</span>
<form action="{{ url_for('login') }}" method="post">
{{ form.csrf_token }}
<!-- <p>username: <input type="text" name="username" /></p>-->
<p>{{ form.username.label }} {{ form.username() }}</p>
{% for e in form.username.errors %}
<span>{{e}}</span>
{% endfor %}
<!-- <p>password: <input type="password" name="password" /></p>-->
<p>{{ form.password.label }} {{ form.password() }}</p>
{% for e in form.password.errors %}
<span>{{e}}</span>
{% endfor %}
<br/>
<input type="submit" value="submit" />
</form>
</div>
</body>
</html>
运行结果:

六、自定义验证函数
def validate_username(self, field): # 自定义验证函数
print("自定义验证函数-username")
username = field.data
print(username)
if username == '123456':
raise ValidationError("用户不存在")
验证函数的名称由validate_fieldname组成,fieldname就是我们在上面定义的属性名称。
本文是Flask学习笔记的第七部分,主要介绍了如何使用Flask-WTF进行表单处理,包括安装、常用HTML字段、验证函数、CSRF保护的实现,以及自定义验证函数的应用示例。

498

被折叠的 条评论
为什么被折叠?



