首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >龙卷风和WTForms

龙卷风和WTForms
EN

Stack Overflow用户
提问于 2013-05-09 03:41:57
回答 3查看 3.5K关注 0票数 7

我是第一次使用WTForms。下面是my forms forms.py,在Tornado中使用WTForms验证POST请求

代码语言:javascript
运行
复制
class UserForm(Form):
    user = TextField('user', [validators.Length(min=23, max=23)])

在我的tonado处理程序中

代码语言:javascript
运行
复制
def post(self):
    form = UserForm(self.request.body)

我得到的错误信息是: formdata应该是一个支持'getlist‘方法的multidict类型的包装器。

我怎么才能让它工作呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-10-22 22:38:22

wtforms-tornado 0.0.1

用于旋风的WTForms扩展。

代码语言:javascript
运行
复制
pip install wtforms-tornado

WTForms-Tornado

票数 8
EN

Stack Overflow用户

发布于 2013-05-09 07:25:56

您需要一个能够将Tornado form对象转换为WTForms所需内容的对象。我使用的是:

代码语言:javascript
运行
复制
class TornadoFormMultiDict(object): 
"""Wrapper class to provide form values to wtforms.Form

This class is tightly coupled to a request handler, and more importantly one of our BaseHandlers
which has a 'context'. At least if you want to use the save/load functionality.

Some of this more difficult that it otherwise seems like it should be because of nature
of how tornado handles it's form input.
"""
def __init__(self, handler): 
    # We keep a weakref to prevent circular references
    # This object is tightly coupled to the handler... which certainly isn't nice, but it's the
    # way it's gonna have to be for now.
    self.handler = weakref.ref(handler)

@property
def _arguments(self):        
    return self.handler().request.arguments

def __iter__(self): 
    return iter(self._arguments) 

def __len__(self):
    return len(self._arguments)

def __contains__(self, name): 
    # We use request.arguments because get_arguments always returns a 
    # value regardless of the existence of the key. 
    return (name in self._arguments)

def getlist(self, name): 
    # get_arguments by default strips whitespace from the input data, 
    # so we pass strip=False to stop that in case we need to validate 
    # on whitespace. 
    return self.handler().get_arguments(name, strip=False) 

def __getitem__(self, name):
    return self.handler().get_argument(name)

然后在你的基础处理程序中,你可以这样做:

代码语言:javascript
运行
复制
self.form = TornadoFormMultiDict(self)

注意:我认为这是从mailing list topic on this subject改编的。

票数 2
EN

Stack Overflow用户

发布于 2014-12-23 03:43:01

我发现用WTForms表单替换Tornado模板中包含的基本html表单并不像我希望的那样直观。

下面是一个使用wtforms-tornado的非常简单的表单示例

模板:

代码语言:javascript
运行
复制
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">

<html lang="en">
<head>
  <meta charset="utf-8">
    <title>A Simple Form</title>
    <meta name="description" content="Submit Track to Infinite Glitch">
</head>
<body>
<p><h1>Submit Info</h1></p>
<form enctype="multipart/form-data" action="/simple" method="post">
{{ form.name }}<br/>
{{ form.email }}<br/>
{{ form.message }}<br/>
<input type="submit"/>
</form>
</body>
</html>    

应用程序代码:

代码语言:javascript
运行
复制
import wtforms
from wtforms_tornado import Form

class EasyForm(Form):
          name = wtforms.TextField('name', validators=[wtforms.validators.DataRequired()], default=u'test')
          email = wtforms.TextField('email', validators=[wtforms.validators.Email(), wtforms.validators.DataRequired()])
          message = wtforms.TextAreaField('message', validators=[wtforms.validators.DataRequired()])

class SimpleForm(tornado.web.RequestHandler):
    def get(self):
        form = EasyForm()
        self.write(templates.load("simpleform.html").generate(compiled=compiled, form=form))

    def post(self):
        form = EasyForm(self.request.arguments)
        details = '';
        if form.validate():
            for f in self.request.arguments:
                details += "<hr/>" + self.get_argument(f, default=None, strip=False)
            self.write(details)
        else:
            self.set_status(400)
            self.write(form.errors)

if __name__ == "__main__":

    application = tornado.web.Application(
        tornadio2.TornadioRouter(SocketConnection).apply_routes([
            (r"/simple", SimpleForm),
        ]),
    )

    application.listen(8888)
    tornado.ioloop.IOLoop.instance().start()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16448913

复制
相关文章

相似问题

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