簡體   English   中英

了解wtforms StringField的實現

[英]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)的行中放置斷點之后):

  1. 轉到包含以上代碼的主運行文件文件,即manage.py。
  2. 在主菜單中轉到運行 -> 調試
  3. 在彈出的窗口中,選擇“ 編輯配置”選項
  4. 在“ RHS”窗格中的“ 腳本參數”中,將值指定為runserver
  5. 應用,然后單擊調試。

現在,當您在瀏覽器中提交表單時,您將到達上面的斷點。 現在,您可以根據需要簡單地進入/遍歷代碼,並按照執行流程跟蹤方法實際被調用的時間。

因此,這里的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM