当前位置: 首页 > article >正文

Python Flask框架学习笔记16

表单:

表单是网站与用户交互必不可少的元素。表单中可以提供文本输入框、单选按钮、复选框、按钮等元素供用户提交数据。

表单还有验证数据的作用,这个是通过javascript进行验证的。那么服务器端要进行数据验证是通过第三方插件Flask-WTF。这个工具有主要有几个作用:验证数据和渲染表单HTML标签、CSRF保护和上传文件。

1、安装:

pip install flask-wtf

2、register.html:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>注册</title>
</head>
<body>
    <form action="{{ url_for('register') }}" method="POST">
        <table>
            <tr>
                <td>用户名:</td>
                <td><input type="text" name="username"></td>
            </tr>
            <tr>
                <td>邮箱:</td>
                <td><input type="email" name="email"></td>
            </tr>
            <tr>
                <td>密码:</td>
                <td><input type="password" name="password"></td>
            </tr>
            <tr>
                <td>确认密码:</td>
                <td><input type="password" name="confirm_password"></td>
            </tr>
            <tr>
                <td></td>
                <td><input type="submit" value="提交"></td>
            </tr>
        </table>
    </form>
</body>
</html>

得到的页面如下:

 

 那我们对这个页面的字段提出一些需求:

1)用户名:至少输入2位以上,最大20个字符;

2)邮箱格式必须以@结尾;

3)密码至少输入6位以上字符;

4)确认密码:该字段内容必须和密码字段内容一致。

如果用户输入错误,在页面上要及时给出提示。

这个工作可以由前端Javascript来完成,但是服务器端也要做好验证。有技术功底的人员可以绕开J前端javascript的验证。服务器端的验证可以通过WTForms来实现。

3、在项目的根路径下创建forms.py文件:

from wtforms import Form, StringField
from wtforms.validators import length, email, equal_to


class RegisterForm(Form):
    username = StringField(Validators=[length(min=3, max=20, message="请输入正确长度的用户名")])
    email = StringField(Validators=[email(message="请输入正确格式的邮箱!")])
    password = StringField(Validator=[length(min=6, max=20, message="请输入正确长度的密码")])
    confirm_password = StringField(Validators=[equal_to("password", message="两次密码不一致")])

Field类的类型:

StringField

IntegerField

FloatField

DecimalField

BooleanField

DatetimeField

DateField

TimeField

FileField

每个字段都传递了Validators参数,这个参数是可以存储多个验证器的集合。

验证器的格式:

length(min, max, message) :   验证长度是否在区间内。

email (): 验证内容是否满足邮箱格式规则。

any_of(values, message, values_formatter): 验证是否是value中的一个。

4、视图函数中使用表单:

from wtforms import Form, StringField
from wtforms.validators import length, email, equal_to


class RegisterForm(Form):
    username = StringField(validators=[length(min=3, max=20, message="请输入正确长度的用户名")])
    email = StringField(validators=[email(message="请输入正确格式的邮箱!")])
    password = StringField(validators=[length(min=6, max=20, message="请输入正确长度的密码")])
    confirm_password = StringField(validators=[equal_to("password", message="两次密码不一致")])

5、视图函数中使用表单:

from flask import Flask, render_template, request, redirect, url_for, flash
from forms import RegisterForm
import config

app = Flask("__name__")
app.config.from_object(config)


@app.route("/register", methods=['GET', 'POST'])
def register():
    if request.method == 'GET':
        return render_template("register.html")
    else:
        # request.form是html模板提交上来的表单数据
        form = RegisterForm(request.form)
        if form.validate():
            email = form.email.data
            username = form.username.data
            password = form.password.data

            print("email: ", email)
            print("username: ", username)
            print("password: ", password)
            return "Register Successfully."
        else:
            for errors in form.errors.values():
                for error in errors:
                    flash(error)
            return redirect(url_for("register"))


if __name__ == "__main__":
    app.run(debug=True)

6、增加config.py:

SECRET_KEY="###"

7、浏览器验证:

 

8、如果表单验证失败,则可以通过form.errors获取错误信息。form.errors是字典类型,key是字段名称,value是错误信息列表。

表单验证失败的情况下,首先通过form.errors.values()获取所有错误内容,并存储在flash中,然后在模板中吧flash消息显示出来。

闪现消息:

需要在视图函数中通过flash函数提交消息内容,消息内容有多条,然后在模板中使用get_flashed_message函数获取函数中提交的消息内容。返回一个列表,使用for循环或者索引取出消息内容。

闪现消息存储在session中,使用之前,必须在app.config中保存SECRET_KEY。随便设置一个值。


http://www.kler.cn/a/4539.html

相关文章:

  • 信号与系统初识---信号的分类
  • istio-proxy oom问题排查步骤
  • Winforms开发基础之非主线程操作UI控件的误区
  • java导出pdf文件
  • 2025年中科院分区大类划分公布!新增8155本
  • 50_Lua垃圾回收
  • 这16个性能测试工具,测试人用了都说好!
  • 安全防御 --- 防火墙(02)-- ASPF、NAT
  • 【Python】好用的办公能手:利用OCR进行PDF文档解析(附教程)
  • RabbitMQ 发送给延迟交换机的消息调用returnedMessage 方法及returnedMessage() 方法的作用
  • RPA Framework
  • fwdiary(8) 区间dp,树形dp 记忆化搜索
  • 2023年学习系列之读出计划
  • SpringBoot整合Flink(施耐德PLC物联网信息采集)
  • Wing IDE 解决鼠标悬浮
  • 人工智能、深度学习和机器学习有哪些区别?
  • 免费空间主机是什么?怎么申请免费空间主机
  • English Learning - L2 第 9 次小组纠音 辅音 [s] [z] [ʃ] [ʒ] [h] [ʧ] [ʤ] 2023.3.25 周六
  • NDK FFmpeg音视频播放器五
  • 深入学习JavaScript系列(三)——this
  • JWT基础教程
  • 注意力汇聚 笔记
  • IO进程线程-标准IO(结)
  • 探究C/C++ typedef的秘密
  • Mysql排序后分页 分页数据有重复
  • python条件语句与循环语句