2016-10-21 2 views
0

Я играю с wtforms в Flask и особенно заинтересован в понимании некоторых аспектов реализации класса StringField.Понимание реализации 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 класс, который я нашел в следующем месте:

сайт-пакеты/wtforms/поля/core.py

core.py, являющийся довольно большим файлом, не может быть вставлен здесь

Теперь в core.py реализована реализация Стрингфилд класс был:

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(), где он привязывается к вызывающему объекту (в нашем случае объект имя пользователя), а затем он наконец возвращается в _value().

Однако process_formdata() сама по себе никогда не вызывается в любом месте во всем core.py файл на 1-е место, а именно, за исключением., Внутри метода класса Field (который наследуется Стрингфилд) процесс()

Но point is, метод () также сам по себе не получает вызова в любом месте всего ядра.

Так что вопрос:

Как именно это self.data набор, когда строка кода делает, что никогда не будет достигнуто на всех? Я уверен, что чего-то не хватает. Пожалуйста, помогите мне понять это лучше.

ответ

0

Хорошо. Круто. Получил это, научившись отлаживать приложение Flask с помощью pycharm, а затем вступая в/над некоторым кодом. Одна из трюков в отладке заключалась в том, чтобы настроить параметры отладки для передачи параметров, необходимых для запуска приложения. В моем случае приложение было время запуска с помощью модуля диспетчера из flask_script как:

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 должно быть дано в качестве аргумента, например:

питона управлять .py runserver

так это runserver аргумент необходимо уделять во время отладки, а также. Так, чтобы сделать это (после того, как вы поставили точку останова в строке форма = LoginForm (Request.Form), где на самом деле все начинается):

  1. Гото основной файл запуска файла, т.е. manage.py, который содержит вышеуказанный код .
  2. Goto Run в главном меню ->Debug
  3. Из всплывающего окна, выберите Edit Configurations варианта
  4. На панели РИТ, в параметрах Script дают значение как runningerver
  5. Применить и нажать кнопку отладки.

Теперь, когда вы отправляете форму в браузере, вы попадете в точку останова, указанную выше. Теперь вы можете просто войти в/над кодом (по мере необходимости) и следовать потоку выполнения, чтобы отслеживать, когда метод фактически вызван.

Таким образом, процесс() здесь в основном вызывается из следующего пути:

сайт-пакеты/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 import StringField, PasswordField

 Смежные вопросы

  • Нет связанных вопросов^_^