2011-11-05 53 views
2

嗨我怎样才能获得与WTForms的HTTP帖子中的变量时,该帖子是用blobstoreuploadhandler完成的,最好还有用于验证的i18n本地化消息? 这是我的代码不工作:与GAE(和WTForms)的HTTP帖子

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 manual about 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() 

记录输出:

信息2011-11-05 23:17 :24,653 main.py:1504]获取请求信息
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并没有神社的作品因此它可能是一些与神社时该准系统例子使用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

我回到基础正在与神社,所以我想我只是建立在这个例子中,看看它打破:

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

我能得到我的原代码,使一切工作除了斑点转移。我怀疑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)) 

信息2011-11-09 12:11:50868 main.py:1385]获取数据: TEST信息 2011-11-09 12:11:50868 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) 
+0

+1的*非常*详细讨论的文档冲 - 和感谢您保持此问题的更新! –

+0

使用'self.request.params'似乎我可以使它工作。这是一个与此有关的重复问题http://stackoverflow.com/questions/2978986/wtfroms-errortypeerror-formdata-should-be-a-multidict-type-wrapper –

回答

1

我不知道WTForm什么,但我猜想,像Django的形式,你需要调用验证函数,然后才能访问数据。在这种情况下,它是form.validate()

form = AdForm(formdata=self.request.POST) 
if form.validate(): 
    ad.title = form.title.data