嗨我怎樣才能獲得與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)
+1的*非常*詳細討論的文檔衝 - 和感謝您保持此問題的更新! –
使用'self.request.params'似乎我可以使它工作。這是一個與此有關的重複問題http://stackoverflow.com/questions/2978986/wtfroms-errortypeerror-formdata-should-be-a-multidict-type-wrapper –