Привет, как я могу получить переменные в сообщении HTTP с WTForms, когда сообщение сделано с 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:
<form action="{{form_url}}" name="upload" method="post" enctype="multipart/form-data" accept-charset="utf-8">
Обновление 3
Эта минимальная конфигурация без WTForms и без Jinja работает, поэтому, вероятно, что-то с Jinja, когда этот простой пример работает с webapp2 и python 2.7, где я собираюсь добавить неисправный код построчно для устранения неполадок:
<code>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('
')
app = webapp2.WSGIApplication ([('/ guest', GuestPage),
('/ знак', Гостевая книга),
...
Обновление 4
Я возвращаюсь к основам работы с Jinja, поэтому я полагаю, что я просто строю этот пример и вижу, где он ломается:
<code>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('
')
Обновление 5
Я могу воспроизвести ошибку на этом минимальном примере, который не может получить доступ к переменной http post:
<code>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('
')
app = webapp2.WSGIApplication ([('/ guest', GuestPage),
('/ знак', Гостевая книга),
Обновление 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))
INFO 2011-11-09 12: 11: 50,868 main.py:1385] получение данных: ИСПЫТАНИЯ
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)