[英]Understanding the wtforms StringField implementation
我在Flask中玩弄wtforms,對了解StringField類的實現的某些方面特別感興趣。
所以我有以下用戶定義的類:
from flask_wtf import Form
from wtforms import StringField, PasswordField
from wtforms.validators import DataRequired
class LoginForm(Form):
username = StringField('Username', validators=[DataRequired()])
password = PasswordField('Password', validators=[DataRequired()])
現在,我實例化此類:
from flask import request
form = LoginForm(request.form)
現在,當我這樣做時:
form.username.data
我基本上是指用戶名對象(它是StringField類的對象)的數據成員。 對 ?
現在我想了解這些數據來自何處?
因此,我繼續執行StringFiled類,該類在以下位置找到:
site-packages / wtforms / fields / core.py
core.py是一個很大的文件,無法在此處粘貼
現在在core.py中, StringField類的實現是:
class StringField(Field):
"""
This field is the base for most of the more complicated fields, and
represents an ``<input type="text">``.
"""
widget = widgets.TextInput()
def process_formdata(self, valuelist):
if valuelist:
self.data = valuelist[0]
else:
self.data = ''
def _value(self):
return text_type(self.data) if self.data is not None else ''
現在,在該類中, 數據成員出現(實際上是已設置)的第一個位置
self.data = valuelist[0]
在process_formdata()內部,將其附加到調用對象(在本例中為對象username ),然后最終在_value()中返回它。
但是,process_formdata()本身從未在整個core.py文件中的任何位置調用,除了Field類方法(StringField繼承) 中的 1個位置(即1個位置)之外。
但關鍵是, process()方法本身本身也並沒有真正在整個core.py中的任何地方被調用。
所以問題是 :
當根本沒有達到那行代碼時, self.data到底是如何設置的? 我肯定會丟失一些東西。 請幫助我更好地理解這一點。
好。 涼。 通過學習如何使用pycharm調試Flask應用程序然后進入/遍歷一些代碼來了解這一點。 調試中的一個小技巧是配置調試設置,以傳遞運行應用程序所需的參數。 在我的情況下,應用是通過使用flask_script中的Manager模塊運行的,如下所示:
from flask_script import Manager
from flask_migrate import Migrate, MigrateCommand
from project import app, db
app.config.from_object('config.DevelopmentConfig')
migrate = Migrate(app, db)
manager = Manager(app)
manager.add_command('db', MigrateCommand)
if __name__ == '__main__':
manager.run()
在以這種方式運行時,需要將runserver作為參數提供,例如:
python manage.py運行服務器
因此,還需要在調試期間提供此runserver參數。 為此,請執行以下操作(在將一切都開始於行形式= LoginForm(request.form)的行中放置斷點之后):
現在,當您在瀏覽器中提交表單時,您將到達上面的斷點。 現在,您可以根據需要簡單地進入/遍歷代碼,並按照執行流程跟蹤方法實際被調用的時間。
因此,這里的process()基本上是從以下路徑調用的:
site-packages / wtforms / forms.py
調用它的代碼段是:
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)
由於用戶定義文件forms.py中的這一行,因此上面的文件進入了圖片
從wtforms導入StringField,PasswordField
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.