GAE(和WTForms)的HTTP帖子
您好,我怎样才能获得与WTForms的HTTP帖子中的变量,当这个职位是与一个blobstoreuploadhandler
完成,最好也与i18n本地化的消息进行验证? 这是我的代码不工作:
class AdForm(Form):
name = TextField(_('Name'))
title = TextField(_('title'))
text = TextAreaField(_('Text'),widget=TextArea())
phonenumber = TextField(_('Phone number'))
phonenumberhide = BooleanField(_('Display phone number on site'))
price = TextField(_('Price'))
password = PasswordField(_('Password'))
email = TextField(_('Email'))
当我尝试访问通过表单发布的数据时,数据变为None
:
form = AdForm(data=self.request.POST)
if form.title:
logging.info('getting title:'+form.title.data)
ad.title = form.title.data
ad.save()
上述内容不会将任何内容保存到数据存储区,并且这是来自它的模板
<div class="labelform">
<div class="labelform" style="clear:left;">
<label> {% filter capitalize %}{% trans %}title{% endtrans %}{% endfilter %}:</label>
</div>
</div>
</td><td>
{{ form.title }}{% if form.title.errors %}
<ul class="errors">{% for error in form.title.errors %}<li>{{ error }}</li>{% endfor %}</ul>
{% endif %}
你可以帮我吗? WTForms手册中有一些关于appengine的内容,但我找不到一个工作示例。
更新
我添加了验证测试,但仍然无法访问变量:
logging.info('getting requests')
if form.validate():
if form.title:
logging.info('getting title:'+form.title.data)
ad.title = form.title.data
ad.save()
ad.put()
记录输出:
INFO 2011-11-05 23:17:24,653 main.py:1504]获取请求INFO
2011-11-05 23:17:24,653 main.py:1507]得到标题:
更新2
我删除了WTForms的依赖,它仍然无法正常工作。 行logging.info('getting data:'+ self.request.get('title', '0'))
只输出0,即使表单只是一个普通的http post表单:
<form action="{{form_url}}" name="upload" method="post" enctype="multipart/form-data" accept-charset="utf-8">
更新3
这个最小的配置没有WTForms,也没有Jinja,所以它可能是Jinja的一些东西,当这个简单的例子与webapp2和python 2.7一起使用时,我将逐行添加错误的代码来排除故障:
class GuestPage(BaseHandler):
def get(self):
self.response.out.write("""
<html>
<body>
<form action="/sign" method="post">
<div><textarea name="content" rows="3" cols="60"></textarea></div>
<div><input type="submit" value="Sign Guestbook"></div>
</form>
</body>
</html>""")
class Guestbook(BaseHandler, I18NHandler, blobstore_handlers.BlobstoreUploadHandler):
csrf_protect = False
def post(self):
self.response.out.write('<html><body>You wrote:<pre>')
self.response.out.write(self.request.get('content'))
self.response.out.write('</pre></body></html>')
app = webapp2.WSGIApplication([ ('/guest', GuestPage),
('/sign', Guestbook),
...
更新4
我回到基础知识是与Jinja合作,所以我想我只是建立在这个例子上,看看它发生了什么:
class GuestPage(BaseHandler):
def get(self):
self.render_jinja('form_jinja')
class Guestbook(BaseHandler, I18NHandler, blobstore_handlers.BlobstoreUploadHandler):
csrf_protect = False
def post(self):
self.response.out.write('<html><body>You wrote:<pre>')
self.response.out.write(self.request.get('content'))
self.response.out.write('</pre></body></html>')
更新5
我可以通过这个无法访问http post变量的最小示例重现错误:
class GuestPage(webapp2.RequestHandler):
def get(self):
self.response.out.write("""
<html>
<body>
<form action=" """ +blobstore.create_upload_url('/sign')+ """ " method="post">
<div><textarea name="content" rows="3" cols="60"></textarea></div>
<div><input type="submit" value="Sign Guestbook"></div>
</form>
</body>
</html>""")
class Guestbook(blobstore_handlers.BlobstoreUploadHandler):
def post(self):
self.response.out.write('<html><body>You wrote:<pre>')
self.response.out.write(self.request.get('content'))
self.response.out.write('</pre></body></html>')
app = webapp2.WSGIApplication([ ('/guest', GuestPage),
('/sign', Guestbook),
更新6
从留言簿示例代码与blobstoreuploadhandler我可以上传生产服务器上的文件,所以我可以做一个工作示例,使用blobstoreuploadhandler,我会尝试构建我的用例。
更新7
我可以得到我的原始代码,以便除blob传输外的所有工作都可以工作。 我怀疑dev_appserver和我发布到google appengine组的差异。 我们将看到它的进展情况。
更新8这里是另一个常见的用法,当你添加WTForms时什么都不起作用:
logging.info('getting data:'+ self.request.get('title', '0'))
logging.info('http post data:'+ str(self.request.post))
form = AdForm(formdata=self.request.data)
logging.info('populated form')
logging.info('form data:' + str(form.formdata))
if form.validate():
if form.title:
logging.info('getting title:'+str( form.get('title') ) )
ad.title = form.title.data ad.save() ad.put()
if form.text:
logging.info('getting text:' +str(form.text))
ad.text = form.text.data
if self.request.get('currency'):
ad.currency = self.request.get('currency')
if self.request.get('cg'):
ad.category = form.cg.data
if self.request.get('company_ad') == '1':
ad.company_ad = True
ad.put()
else:
logging.info('form did not validate')
except Exception, ex:
logging.info('there occured exception %s', str(ex))
INFO 2011-11-09 12:11:50,868 main.py:1385]获取数据:TEST INFO 2011-11-09 12:11:50,868 main.py:1409]发生了异常发布
更新9
最后,表单填充它只是不验证。 谢谢肖恩的信息,让我进一步。 现在我过去填充表单对象,但没有例外,但是当我尝试验证时发生异常:
logging.info('getting data:'+ self.request.get('title', '0'))
form = AForm(self.request.POST)
logging.info('populated form')
if form.validate():
logging.info('validated form')
上面的代码记录输出:
INFO 2011-11-11 08:03:59,913 main.py:1387] getting data:TEST
INFO 2011-11-11 08:03:59,914 main.py:1390] populated form
INFO 2011-11-11 08:03:59,914 main.py:1412] there occured exception 'builtin_function_or_method' object is not iterable
例外是什么意思?
我的表格课是
class AForm(Form):
name = TextField(_('Name'))
title = TextField(_('title'))
text = TextAreaField(_('Text'),widget=TextArea())
phonenumber = TextField(_('Phone number'))
phonenumberhide = BooleanField(_('Display phone number on site'))
price = TextField(_('Price'))
password = PasswordField(_('Password'))
email = TextField(_('Email'))
category = SelectField(choices=categories.keys)
我对WTForm一无所知,但我猜想像Django一样,在访问数据之前需要调用验证函数。 在这种情况下,它是form.validate()
:
form = AdForm(formdata=self.request.POST)
if form.validate():
ad.title = form.title.data
丹尼尔实际上它不是data = self.request.POST,你需要传递给窗体,但formdata而不是数据http://wtforms.simplecodes.com/docs/dev/forms.html#the-form-class
希望对于那些像我一样冲过文档的人来说,这将是有用的
链接地址: http://www.djcxy.com/p/61749.html