首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >了解wtforms实现

了解wtforms实现
EN

Stack Overflow用户
提问于 2016-10-21 22:05:35
回答 1查看 4K关注 0票数 1

我正在使用StringField类中的wtform,并且对理解类实现的某些方面特别感兴趣。

因此,我有以下用户定义的类:

代码语言:javascript
复制
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()])

现在我实例化这个类,如下所示:

代码语言:javascript
复制
from flask import request
form = LoginForm(request.form)

当我这么做的时候:

form.username.data

我基本上是指username对象的数据成员(它是StringField类的对象)。对吧?

现在我想知道 data 是从哪里来的?

因此,我开始了StringFiled类的实现,我在以下位置找到了这个类:

站点-包/wtform/field/core.py

core.py是一个很大的文件不能粘贴在这里

现在,在core.py中,StringField类的实现是:

代码语言:javascript
复制
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 ''

现在,在这个类中,数据成员出现的第一个位置(实际上已经设置)在行中。

代码语言:javascript
复制
self.data = valuelist[0]

在process_formdata()中,它被附加到调用对象(在本例中是对象用户名),然后在_value()中返回。

但是,process_formdata()本身在整个core.py文件中的任何地方都不会被调用,除了一个位置,即Field方法( StringField继承的方法)进程()

但关键是,process()方法本身在整个core.py中的任何地方都不会被调用。

所以问题是

当代码行根本没有到达时,self.data究竟是如何设置的?我肯定漏掉了什么。请帮我更好地理解这一点。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-24 15:04:25

好的。凉爽的。通过学习如何使用py魅力调试Flask应用程序,然后进入/遍历一些代码,就得到了这一点。调试中的一个关键部分是配置调试设置,以传递运行应用程序所需的参数。在我的例子中,应用程序是通过使用来自flask_script的Manager模块来运行的,如下所示:

代码语言:javascript
复制
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)中放置一个断点之后):

  1. 转到包含上述代码的主运行文件文件(即manage.py )。
  2. 在主菜单->调试中运行
  3. 在弹出的窗口中,选择“编辑配置”选项。
  4. 在RHS窗格中,在脚本参数中将值设为runserver。
  5. 应用,然后单击调试。

现在,当您在浏览器中提交表单时,您会碰到上面放置的断点。现在,您可以直接进入/遍历代码(视需要而定),并按照执行流程跟踪方法何时实际被调用。

因此,这里的流程()基本上是从以下路径调用的:

网站-包/wtform/forms.py

调用它的代码片段是:

代码语言:javascript
复制
    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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40186085

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档