HTTP-сообщение с GAE (и WTForms) - PullRequest
2 голосов
/ 06 ноября 2011

Привет, как я могу получить переменные в сообщении 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)

Ответы [ 2 ]

1 голос
/ 21 мая 2012

Даниэль, на самом деле это не data = self.request.POST, который нужно передать в форму, а данные формы вместо данных http://wtforms.simplecodes.com/docs/dev/forms.html#the-form-class

надеюсь, что это будет полезно для всех тех, кто бросился через документ, как я

1 голос
/ 06 ноября 2011

Я ничего не знаю о WTForm, но я предполагаю, что, как и формы Django, вам нужно вызвать функцию проверки, прежде чем вы сможете получить доступ к данным. В данном случае это form.validate():

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