资讯专栏INFORMATION COLUMN

Flask五之表单

justCoding / 1046人阅读

摘要:通过的核心特性,函数可实现这种效果仅调用函数并不能把消息显示出来,程序使用的模板要渲染这些消息。注意在模板中使用循环是因为在之前的请求循环中每次调用函数时都会生成一个消息,所以可能有多个消息在排队等待显示。

五、表单 1、Flask-WTF 扩展

Flask-WTF 及其依赖可使用 pip 安装:

(venv) $ pip install flask-wtf
2、跨站请求伪造保护

【设置密钥】

app = Flask(__name__)
app.config["SECRET_KEY"] = "hard to guess string"

app.config 字典可用来存储框架、 扩展和程序本身的配置变量。

3、表单类

创建表单的三个步骤:

定义Form的子类

在类里添加字段

在字段里添加验证函数

# Form 基类由 Flask-WTF 扩展定义
from flask_wtf import FlaskForm
# 字段直接从 WTForms 包中导入
from wtforms import StringField,SubmitField
# 验证函数直接从 WTForms 包中导入
from wtforms.validators import DataRequired,Length

class NameForm(Form):
    name = StringField("Input your name:",validators=[DataRequired()])
    submit = SubmitField("Submit")

与其他扩展的使用方法不同之处在于:
①不是实例化,而是继承
②还需要从wtforms当中导入字段和验证函数

【注意】
Form 基类由 Flask-WTF 扩展定义,所以从 flask_wtf 中导入。字段和验证函数
却可以直接从 WTForms 包中导入。

4、把表单渲染成HTML

表单字段是可调用的,在模板中调用后会渲染成 HTML。假设视图函数把一个
NameForm 实例通过参数 form传入模板,在模板中可以生成一个简单的表单,
如下所示:

{{ form.hidden_tag() }} {{ form.name.label }} {{ form.name() }} {{ form.submit() }}

可以使用Bootstrap 中预先定义好的表单样式渲染整个 Flask-WTF 表单,
使用 Flask-Bootstrap,上述表单可使用下面的方式渲染:

{% import "bootstrap/wtf.html" as wtf %}
{{ wtf.quick_form(form) }}

具体渲染方式如下:
【form.html】

{% extends "base.html" %}
{% import "bootstrap/wtf.html" as wtf %}
{% block title %}Flasky{% endblock %}
{% block page_content %}

{{ wtf.quick_form(form) }}
{% endblock %}

模板的内容区现在有两部分。第一部分是页面头部,显示欢迎消息。这里用到了一个
模板条件语句。 Jinja2中的条件语句格式为 {% if condition %}...{% else %}...{% endif %}。
如果条件的计算结果为 True,那么渲染 if 和 else 指令之间的值。如果条件的计算结果为False,
则渲染else 和 endif 指令之间的值。在这个例子中,如果没有定义模板变量 name,则会渲染字
符串“Hello,Stranger!”。内容区的第二部分使用 wtf.quick_form() 函数渲染NameForm 对象。

5、在视图函数中处理表单

视图函数 index() 不仅要渲染表单,还要接收表单中的数据。

@app.route("/form/",methods = ["GET","POST"])
def form():
    name = None
    form = NameForm()
    if form.validate_on_submit():
        name = form.name.data
        form.name.data = ""
    return render_template("form.html",form = form, name = name)
6、重定向和用户会话
上面的视图函数存在一个可用性问题。用户输入名字后提交表单,然后点击浏览器
的刷新按钮,会看到一个莫名其妙的警告,要求在再次提交表单之前进行确认:

之所以出现这种情况,是因为刷新页面时浏览器会重新发送之前已经发送过的最后
一个请求。如果这个请求是一个包含表单数据的 POST 请求,刷新页面后会再次提
交表单。大多数情况下,这并不是理想的处理方式。很多用户都不理解浏览器发出
的这个警告。基于这个原因, 最好别让 Web 程序把 POST 请求作为浏览器发送的
最后一个请求。
这种需求的实现方式是, 使用**重定向**作为 POST 请求的响应,而不是使用常规
响应。这个技巧称为 Post/ 重定向 /Get 模式。

程序可以把数据存储在** 用户会话 **中,在请求之间“记住”数据。用户会话是一
种私有存储,存在于每个连接服务器的客户端中。 我们在请求与响应中介绍过用户
会话,它是请求上下文中的变量,名为 ** session **,像标准的 Python 字典一
样操作。
from flask import session
@app.route("/form2/",methods = ["GET","POST"])
def form2():
    form = NameForm()
    if form.validate_on_submit():
        session["name"] = form.name.data
        # 这里也不需要设置form.name.data = "",
        # 因为已经重定向到别的url去了,下次再到这个界面会自动初始化为""
        return redirect(url_for("hello"))
    return render_template("form.html",form = form, name = session.get("name"))
7、Flash消息
请求完成后,有时需要让用户知道状态发生了变化。这里可以使用确认消息、警告或者
错误提醒。一个典型例子是,用户提交了有一项错误的登录表单后,服务器发回的响应
重新渲染了登录表单,并在表单上面显示一个消息,提示用户用户名或密码错误。
通过Flask 的核心特性,** flash()函数 **可实现这种效果
from flask import flash
@app.route("/form3/",methods = ["GET","POST"])
def form3():
    form = NameForm()
    if form.validate_on_submit():
        old_name = session.get("name")
        if old_name is not None and old_name != form.name.data :
            flash("you have changed your name")
        session["name"] = form.name.data
        return redirect(url_for("hello"))
    return render_template("form.html",form = form, name = session.get("name"))
仅调用 flash() 函数并不能把消息显示出来,程序使用的模板要渲染这些消息。
最好在基模板中渲染 Flash消息,因为这样所有页面都能使用这些消息。 Flask 
把 get_flashed_messages() 函数开放给模板,用来获取并渲染消息。

【base.html】

{% block content %}
{% for message in get_flashed_messages() %}
{{ message }}
{% endfor %} {% block page_content %}{% endblock %}
{% endblock %}

在这个示例中,使用 Bootstrap 提供的警报 CSS 样式渲染警告消息。
【注意】
在模板中使用循环是因为在之前的请求循环中每次调用 flash() 函数时都会生成一个消息,
所以可能有多个消息在排队等待显示。 get_flashed_messages() 函数获取的消息在下次调
用时不会再次返回,因此 Flash消息只显示一次,然后就消失了。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/40795.html

相关文章

  • Flask Web Development —— Web表单(上)

    摘要:每个表单域都可以连接到一个或多个是一个用于检查用户提交的输入是否合法的函数。表单域构造函数的第一个参数是一个,在渲染表单到时会使用。验证确保提交的表单域不为空。表单域验证都是直接从包中导入。表格展示了一组支持的标准表单域。 第二章中介绍的request对象公开了所有客户端发送的请求信息。特别是request.form可以访问POST请求提交的表单数据。 尽管Flask的request...

    CODING 评论0 收藏0
  • python大佬养成计划----flask应用(表单)

    摘要:特别是可以访问请求提交的表单数据。表单的代码生成和验证提交的表单数据就是两个很好的例子。优势扩展使得处理表单能获得更愉快的体验。设计了表单库来使可以更加简便地管理操作表单数据。 1. 为什么使用Flask-WTF? request对象公开了所有客户端发送的请求信息。特别是request.form可以访问POST请求提交的表单数据。 尽管Flask的request对象提供的支持足以处理w...

    alighters 评论0 收藏0
  • Javascript数组系列五之增删改和强大的 splice()

    摘要:删除数组元素的开始索引需要删除元素的个数,插入数组的元素语法因为参数变化多样,我们主要从三个方面来展示的用法。 今天是我们介绍数组系列文章的第五篇,也是我们数组系列的最后一篇文章,只是数据系列的结束,所以大家不用担心,我们会持续的更新干货文章。 生命不息,更新不止! 今天我们就不那么多废话了,直接干货开始。 我们在《Javascript数组系列一之栈与队列》中描述我们是如何利用 pus...

    chavesgu 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<