我正在使用StringField类中的wtform,并且对理解类实现的某些方面特别感兴趣。
因此,我有以下用户定义的类:
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
我基本上是指username对象的数据成员(它是StringField类的对象)。对吧?
现在我想知道 data 是从哪里来的?
因此,我开始了StringFiled类的实现,我在以下位置找到了这个类:
站点-包/wtform/field/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()中,它被附加到调用对象(在本例中是对象用户名),然后在_value()中返回。
但是,process_formdata()本身在整个core.py文件中的任何地方都不会被调用,除了一个位置,即Field方法( StringField继承的方法)进程()
但关键是,process()方法本身在整个core.py中的任何地方都不会被调用。
所以问题是
当代码行根本没有到达时,self.data究竟是如何设置的?我肯定漏掉了什么。请帮我更好地理解这一点。
发布于 2016-10-24 15:04:25
好的。凉爽的。通过学习如何使用py魅力调试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参数也需要在调试期间给出。因此,要做到这一点(在实际启动一切的行表单= LoginForm(request.form)中放置一个断点之后):
现在,当您在浏览器中提交表单时,您会碰到上面放置的断点。现在,您可以直接进入/遍历代码(视需要而定),并按照执行流程跟踪方法何时实际被调用。
因此,这里的流程()基本上是从以下路径调用的:
网站-包/wtform/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中的这一行而进入图片的。
从wtform导入StringField,PasswordField
https://stackoverflow.com/questions/40186085
复制相似问题