提交表单刷新页面_Python Flask Web表单

本文介绍了如何使用Python Flask与Flask-WTF处理Web表单,包括配置应用密钥、创建表单类、渲染HTML、处理GET/POST请求、重定向避免表单重复提交,以及使用闪现消息提供用户反馈。
摘要由CSDN通过智能技术生成

66f8f6a23df023bfd0487ff2a7ad0196.png

学习照猫画虎,是一种享受,实际上学习的痛苦是短暂的,没去学的痛苦是长期的。以后会有很多瞬间,因为你自己不会,而错失了良机~

1、配置

Flask-WTF 可以把处理Web表单的过程变成一种愉快的体验,首先是安装~

164d31a6235ad3e8e079b57ac775e13e.png

然后是配置一个应用密钥,越复杂越好,这是为了防止CSRF跨站脚本伪造,Flask-WTF 为所有表单生成安全令牌,存储在用户会话中~

c23d19d87a2a106f12e53269e4c48b2e.png

2、表单类

每个表单都由一个继承 FlaskForm 的类表示,这个类定义表单中的一组字段,每个字段都是一个对象,字段对象可以附属多个验证函数,用于验证用户提交的数据是否有效~

fa58b37255731273d6e2395775f69987.png
  • NameForm 是一个大表单
  • name 是StringField类对象,表示type="text"的<input>元素
  • submit 是SubmitField类对象,表示type="submit"的<input>元素
  • 对象的第一个参数会渲染成 label
字段类型说明
BooleanField复选框,值为True或False
DateField文本字段,值为datetime.date格式
DateTimeField文本字段,值为datetime.datetime格式
DecimalField文本字段,值为decimal.Decimal
FileField文件上传字段
HiddenField隐藏的文本字段
MultipleFileField多文件创段字段
FieldList一组指定类型的字段
FloatField文本字段,值为浮点型
FormField把一个表单作为字段,嵌入另一个表单
IntegerField文本字段,值为整数
PasswordField密码文本字段
RadioField一组单选按钮
SelectField下拉列表
SelectMultipleField下拉列表,值可以多选
SubmitField表单提交按钮
StringField文本字段
TextAreaField多行文本字段

常见的wtf 表单验证函数

验证函数说明
DataRequired确保转换类型后字段中有数据
Email验证电子邮件
EqualTo比较两个字段的值
InputRequired确保转换类型前字段中有数据
IPAddress验证IPv4网络地址
Length验证输入字符串的长度
MacAddress验证MAC地址
NumberRange验证输入的值在数字范围之内
Optional允许字段中没有输入
Regexp使用正则表达式验证输入值
URL验证URL
UUID验证UUID
AnyOf验证输入值在一组可能的值中
NoneOf确保输入值不在一组可能的值中

3、把表单渲染成HTML

可以使用Bootstrap预定义的表单样式渲染整个Flask-WTF表单,只需要2句话就可以了,wtf.quick_form() 函数的参数是Flask-WTF表单对象,使用Bootstrap的默认样式渲染传入的表单~

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

9b114ef72e171b40b9c20fd059bf0c32.png

4、在视图中处理表单

  • 直接请求,没有提交表单,是GET请求
  • 提交表单,就是POST请求
  • form参数和name参数,都会进入index.html进行渲染
@app.route("/",methods=["GET","POST"])
def index():
    name = None
    form = NameForm()
    if form.validate_on_submit():
        name = form.name.data
        form.name.data = ""
    return render_template("index.html",form=form,name=name)

c53751d9f0653b034b669268677fb832.png

输入ailx10,然后提交表单,渲染效果如下:

322852908c5663285d41e0043fb44c05.png

5、重定向和用户会话

当我们刷新页面的时候,页面会弹出来一个对话框,这是因为我们是POST提交的表单,页面刷新会再次提交表单,但是这并不是我们期望的~

33e8c10dcef91262a2de3990bf709097.png

于是就有了重定向了,我们最好让Web应用以GET方式结尾,这样怎么刷新都没问题~

  • redirect(url_for("index")) 重定向到一个新的URL
  • name=session.get("name") 如果没有GET到内容,返回None
@app.route("/",methods=["GET","POST"])
def index():
    form = NameForm()
    if form.validate_on_submit():
        session["name"] = form.name.data
        return redirect(url_for("index"))
    return render_template("index.html",form=form,name=session.get("name"))

5944989aea9f541ee460a65d0fa4dd07.png

6、闪现消息

请求完成后,有时需要让用户感知状态发送了变化,Flask内置了这个功能~

flash函数可以实现这个效果,如果你第一次和第二次输入的名字不一样,那么会出现一个提醒:“你改名字啦~“

{% block content %}
<div class="container">
    {% for message in get_flashed_messages() %}
    <div class="alert alert-warning">
        <button type="button" class="close" data-dismiss="alert">&times;</button>
        {{ message }}
    </div>
    {% endfor %}
    {% block page_content %}{% endblock %}
</div>
{% endblock %}

a7bad5e30453021013d23ed26379f41d.png
@app.route("/",methods=["GET","POST"])
def index():
    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("你改名字啦~")
        session["name"] = form.name.data
        return redirect(url_for("index"))
    return render_template("index.html",form=form,name=session.get("name"))

本篇完,谢谢大家~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值