我使用WTForms首次。 使用WTForms验证POST请求在龙卷风下面是我的形式forms.py
class UserForm(Form):
user = TextField('user', [validators.Length(min=23, max=23)])
在tonado处理程序我有
def post(self):
form = UserForm(self.request.body)
该错误消息我得到的是:FORMDATA应该是支持“的GetList”方法”一multidict型包装
我怎样才能使这项工作?
wtforms捻0.0.1
WTForms扩展龙卷风。
pip install wtforms-tornado
WTForms基旋风
你需要一个对象,可以龙卷风表单对象转化为东西WTForms预期。 我用这个:
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)
然后在你的基本处理程序,你会做这样的事情:
self.form = TornadoFormMultiDict(self)
注:我觉得这个改编自一个关于这个主题的邮件列表话题 。
我没有找到替代包含有WTForms形式直观像我可能会希望龙卷风模板内的基本HTML表单。
下面是一个使用非常简单的形式的一个例子wtforms-tornado
:
模板:
<!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>
该应用程序的代码:
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()