学习照猫画虎,是一种享受,实际上学习的痛苦是短暂的,没去学的痛苦是长期的。以后会有很多瞬间,因为你自己不会,而错失了良机~
1、配置
Flask-WTF 可以把处理Web表单的过程变成一种愉快的体验,首先是安装~
ailx10
10w+ 次咨询
网络安全优秀回答者
网络安全硕士
去咨询
然后是配置一个应用密钥,越复杂越好,这是为了防止CSRF跨站脚本伪造,Flask-WTF为所有表单生成安全令牌,存储在用户会话中~
2、表单类
每个表单都由一个继承 FlaskForm 的类表示,这个类定义表单中的一组字段,每个字段都是一个对象,字段对象可以附属多个验证函数,用于验证用户提交的数据是否有效~
- NameForm 是一个大表单
- name 是StringField类对象,表示type="text"的元素
- submit 是SubmitField类对象,表示type="submit"的元素
- 对象的第一个参数会渲染成 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 | 确保转换类型后字段中有数据 | 
| 验证电子邮件 | |
| 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) }}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)输入ailx10,然后提交表单,渲染效果如下:
5、重定向和用户会话
当我们刷新页面的时候,页面会弹出来一个对话框,这是因为我们是POST提交的表单,页面刷新会再次提交表单,但是这并不是我们期望的~
于是就有了重定向了,我们最好让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"))6、闪现消息
请求完成后,有时需要让用户感知状态发送了变化,Flask内置了这个功能~
flash函数可以实现这个效果,如果你第一次和第二次输入的名字不一样,那么会出现一个提醒:“你改名字啦~“
{% block content %}
    {% for message in get_flashed_messages() %}
    
        
        {{ message }}
    
    {% endfor %}
    {% block page_content %}{% endblock %}
{% endblock %}@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"))本篇完,谢谢大家~
发布于 2021-01-12 23:08 (知乎)
