我在看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()北大青鳥APTECH成立于1999年。依托北京大學優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
達內(nèi)教育集團成立于2002年,是一家由留學海歸創(chuàng)辦的高端職業(yè)教育培訓機構(gòu),是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
北大課工場是北京大學校辦產(chǎn)業(yè)為響應國家深化產(chǎn)教融合/校企合作的政策,積極推進“中國制造2025”,實現(xiàn)中華民族偉大復興的升級產(chǎn)業(yè)鏈。利用北京大學優(yōu)質(zhì)教育資源及背
博為峰,中國職業(yè)人才培訓領(lǐng)域的先行者
曾工作于聯(lián)想擔任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔任項目經(jīng)理從事移動互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍懿科技有限責任公司從事總經(jīng)理職務(wù)負責iOS教學及管理工作。
浪潮集團項目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺面向?qū)ο箝_發(fā)經(jīng)驗,技術(shù)功底深厚。 授課風格 授課風格清新自然、條理清晰、主次分明、重點難點突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應用開發(fā)經(jīng)驗。曾經(jīng)歷任德國Software AG 技術(shù)顧問,美國Dachieve 系統(tǒng)架構(gòu)師,美國AngelEngineers Inc. 系統(tǒng)架構(gòu)師。