flask是怎么处理POST请求的?

我在看flask web development那本书,对通过POST提交表单到服务器的处理逻辑很疑惑。
下面是书中的一个代码片段,是root路径对应的view function:

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

页面截图:

图片描述

我的想法是:当用户第一次访问主页时,浏览器发出GET请求,服务器调用index()函数对该请求进行处理,form通过NameForm()创建,此时为空,所以form.validate_on_submit()返回False。但是,当用户通过POST提交表单的时候,服务器应该还是调用index()函数对该请求进行处理,那这样不是又通过form = NameForm()创建了一个新表单吗?这个新表单应该还是空的啊?为什么这个时候form.validate_on_submit()会返回True?

flask是怎么处理如示例代码这种涉及表单的POST请求的?

谢谢。

阅读 4.6k
1 个回答
# 因为这个地方涉及到了python中的元类,而我元类理解的不到家
# 所以就不详细解释了,只给楼主说下大致流程吧
# 免得元类那块说错了,再误导楼主

# 因为楼主没有写,我就认为楼主使用的插件是flask-wtf了
# 直接看Form的父类 flask_wtf.form.FlaskForm 和 wtforms.form就可以了

# 在 flask_wtf.form.FlaskForm 中定义了一个 Meta 内部类
# 在这个内部类中有如下方法,就是在这个方法中获取的表单中的值的
def wrap_formdata(self, form, formdata):
  if formdata is _Auto:
    if _is_submitted():
      if request.files:
        return CombinedMultiDict((
          request.files, request.form
        ))
      elif request.form:
        return request.form
      elif request.get_json():
        return ImmutableMultiDict(request.get_json())

    return None

  return formdata

# 然后在wtforms.form.BaseForm中通过如下方法,为自定义的每个filed赋值
def process(self, formdata=None, obj=None, data=None, **kwargs):
  # 这个就是form表单中的内容了
  formdata = self.meta.wrap_formdata(self, formdata)

  if data is not None:
    kwargs = dict(data, **kwargs)

  # 这里通过form表单中的值,为每个自定义filed赋值
  for name, field, in iteritems(self._fields):
    if obj is not None and hasattr(obj, name):
      field.process(formdata, getattr(obj, name))
    elif name in kwargs:
      field.process(formdata, kwargs[name])
    else:
      field.process(formdata)
# 注:
# 如下操作确实是会创建一个新的对象,但是因为这个新的对象中的 __init__ 方法
# 是会对这个对象进行一定初始化的,而这个初始化的过程中会通过如上方式
# 获取form表单中的值,并赋值给每个filed
# 所以才会出现 POST 请求时 form.validate_on_submit() 为 True
form = NameForm()
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题