在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/Python/ flask是怎么處理POST請求的?

flask是怎么處理POST請求的?

我在看flask web development那本書,對通過POST提交表單到服務(wù)器的處理邏輯很疑惑。
下面是書中的一個代碼片段,是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)

頁面截圖:

圖片描述

我的想法是:當用戶第一次訪問主頁時,瀏覽器發(fā)出GET請求,服務(wù)器調(diào)用index()函數(shù)對該請求進行處理,form通過NameForm()創(chuàng)建,此時為空,所以form.validate_on_submit()返回False。但是,當用戶通過POST提交表單的時候,服務(wù)器應該還是調(diào)用index()函數(shù)對該請求進行處理,那這樣不是又通過form = NameForm()創(chuàng)建了一個新表單嗎?這個新表單應該還是空的啊?為什么這個時候form.validate_on_submit()會返回True?

flask是怎么處理如示例代碼這種涉及表單的POST請求的?

謝謝。

回答
編輯回答
風清揚
# 因為這個地方涉及到了python中的元類,而我元類理解的不到家
# 所以就不詳細解釋了,只給樓主說下大致流程吧
# 免得元類那塊說錯了,再誤導樓主

# 因為樓主沒有寫,我就認為樓主使用的插件是flask-wtf了
# 直接看Form的父類 flask_wtf.form.FlaskForm 和 wtforms.form就可以了

# 在 flask_wtf.form.FlaskForm 中定義了一個 Meta 內(nèi)部類
# 在這個內(nèi)部類中有如下方法,就是在這個方法中獲取的表單中的值的
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表單中的內(nèi)容了
  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)
# 注:
# 如下操作確實是會創(chuàng)建一個新的對象,但是因為這個新的對象中的 __init__ 方法
# 是會對這個對象進行一定初始化的,而這個初始化的過程中會通過如上方式
# 獲取form表單中的值,并賦值給每個filed
# 所以才會出現(xiàn) POST 請求時 form.validate_on_submit() 為 True
form = NameForm()
2018年1月24日 12:17