一、介绍
Flask 和 WTForms 的简单集成,包括 CSRF、文件上传、 和 reCAPTCHA。
功能
-
与 WTForms 集成。
-
带有 CSRF 令牌的安全表单。
-
全球 CSRF 保护。
-
reCAPTCHA 支持。
-
与 Flask-Uploads 配合使用的文件上传。
-
使用 Flask-Babel 进行国际化。
二、安装
这次介绍一个参数U
在pip安装或更新时使用;代表是安装或更新
pip install -U Flask-WTF

三、快速入门
3.1 创建表单
Flask-WTF 提供 Flask 应用程序与 WTForms 的集成。
但是需要注意的是:从
0.9.0
版本开始,Flask-WTF
将不再从wtforms
导入任何内容, 您需要从WTForms
导入字段
# 导入falsk
from flask import Flask, render_template, jsonify, redirect
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField
from wtforms.validators import DataRequired
# 自定义表单
class MyLoginForm(FlaskForm):
name = StringField('name', validators=[DataRequired()])
password = PasswordField('password', validators=[DataRequired()])
# 通过导入的falsk,创建一个app
app = Flask(__name__)
# 切记,csrf需要一个秘钥哦
# 通过 python -c "import secrets; print(secrets.token_hex())" 来实现
app.secret_key = "16623b4eb38efb00f2b8e7f5359f80d1826caf0c77506856e1e12cfc53b0dc83"
# 首页
@app.route('/')
def index():
return render_template('index.html')
# 登录,这里没有做用户名和密码的验证,仅仅用于演示
@app.route('/login/', methods=['GET', 'POST'])
def submit():
form = MyLoginForm()
# 是否通过表单验证,表单验证指的是:是否经过了非空、指定类型等验证,不进行业务验证
if form.validate_on_submit():
return redirect('/')
return render_template('login.html', form=form)
# 开启运行
if __name__ == '__main__':
app.run(debug=True)
"""
debug,是否开启调试模式,开启后,重新启动程序,当再次修改Python代码后,会立即启动
port,启动指定服务器的端口号,默认是5000
host,主机,默认是127.0.0.1;如果指定0.0.0.0代表本机的所以IP
"""
3.2 创建模板
login.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登录</title>
</head>
<body>
<form method="POST" action="/login">
{# 用于解决csrf攻击的;form来自于后端传递的对象#}
{{ form.csrf_token }}
{{ form.name.label }} {{ form.name(size=20) }}
{{ form.password.label }} {{ form.password() }}
<input type="submit" value="登录">
</form>
</body>
</html>
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>首页</title>
</head>
<body>
登录成功
</body>
</html>
3.3 带错误返回的表单
如果您的表单包含验证,则需要添加到模板中才能显示 任何错误消息。使用上面示例中的字段,该看起来像这样:form.name
{% if form.name.errors %}
<ul class="errors">
{% for error in form.name.errors %}
<li>{{ error }}</li>
{% endfor %}
</ul>
{% endif %}
四、关于CSRF的配置
默认情况下,CSRF是开启的,当然也可以在表单上进行关闭
form = FlaskForm(meta={'csrf': False})
当然,也可以在全局配置中进行关闭,但是不推荐这样
WTF_CSRF_ENABLED = False
使用CSRF需要一个安全的秘钥,就是上面代码中配置的
app.secret_key
如果使用单独的秘钥,可以如下使用
WTF_CSRF_SECRET_KEY = 'a random string'
五、文件上传
5.1 表单部分
class PhotoForm(FlaskForm):
photo = FileField(validators=[FileRequired()])
@app.route('/upload/', methods=['GET', 'POST'])
def upload():
form = PhotoForm()
if form.validate_on_submit():
f = form.photo.data
filename = secure_filename(f.filename)
f.save(os.path.join(
app.instance_path, 'photos', filename
))
return redirect(url_for('index'))
return render_template('upload.html', form=form)
5.2 创建模板
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>文件上传</title>
</head>
<body>
<form action="{{ url_for('upload') }}" method="post" enctype="multipart/form-data">
{{ form.csrf_token }} {#渲染csrf#}
<p>{{ form.photo.label }}{{ form.photo }}</p>
<input type="submit" value="提交">
</form>
</body>
</html>
原文始发于微信公众号(Python之家):Flask-12-表单验证
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/198249.html