Flask-12-表单验证

一、介绍

Flask 和 WTForms 的简单集成,包括 CSRF、文件上传、 和 reCAPTCHA。
功能

  • 与 WTForms 集成。

  • 带有 CSRF 令牌的安全表单。

  • 全球 CSRF 保护。

  • reCAPTCHA 支持。

  • 与 Flask-Uploads 配合使用的文件上传。

  • 使用 Flask-Babel 进行国际化。

二、安装

这次介绍一个参数U在pip安装或更新时使用;代表是安装或更新

pip install -U Flask-WTF
Flask-12-表单验证
image.png

三、快速入门

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

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!