2011-11-05 54 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