表单处理Flask-WTF(四)

1. 视图函数中的表单操作

  • methods参数被添加到app.route装饰器中,目的是让Flask注册视图函数为GET和POST请求处理程序到URL映射中。若methods参数未给出,视图函数将只注册为GET请求。

  • GET和POST提交表单的区别?

@app.route('/', methods=['GET', 'POST']) 
def index():
    # 局部变量name用于保存从表单中接收到的名字,初始化时变量为None。
    name = None
    # 视图函数创建一个NameForm实例来表示一个表单。
    form = NameForm()

    if form.validate_on_submit():
        name = form.name.data
        form.name.data = ''
    return render_template('index.html', form=form, name=name)

2. validate_on_submit理解

  • 表单的validate_on_submit()方法会在表单被提交且数据通过了所有验证的时候返回True。其他情况下validate_on_submit()返回False。
    • 当用户第一次访问应用程序,服务器会收到一个没有表单数据的GET请求,这个时候validate_on_submit()会返回False。
      # 当用户提交表单,服务器会收到一个带有数据的POST请求。validate_on_submit()调用Required()验证程序验证相应的表单域。如果name不为空,验证程序接收它同时validate_on_submit()返回True。

3. 重定向和用户session

上述代码的问题1:

  • 请求刷新页面的时候浏览器重复了上一次发送的请求。当上一次发送的是一个带有表单数据的POST请求,刷新页面会导致重复的表单提交;
  • 注意: 一种不错的方法是永远不将POST请求作为浏览器最后发送的请求。

解决方式:

  • 使用redirect响应POST请求来代替常规的响应来实现。重定向是一个特殊类型的响应,使用URL来代替HTML代码字符串。当浏览器收到这个响应,它就会给重定向URL发出一个GET请求,然后显示页面。页面也许需要几毫秒的时间来加载,因为需要发送第二个请求给服务器,除此之外用户不会看到任何不同。现在最后一次请求为GET,所以刷新会像预期的那样。这个方法被称为Post/Redirect/Get模式。

上述代码问题2:

当应用程序处理POST请求,需要访问用户输入并保存在form.name.data中的名字,但是一旦该请求结束表单数据就会丢失。因为POST请求是通过重定向来处理,应用程序需要存储名字,以便重定向后的请求可以得到它并使用它来创建真实的响应。

解决方式:

from flask import Flask, render_template, session, redirect, url_for

@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'))

猜你喜欢

转载自blog.csdn.net/gf_lvah/article/details/81128694
今日推荐