Как обмениваться данными между страницами в Google App Engine - PullRequest
3 голосов
/ 24 марта 2011

Я начинающий программист, работаю над своим первым веб-приложением (использующим App Engine), так что прости мое невежество.

Я модифицировал программу Hello World, предоставленную Google, чтобы попытаться заставить ее делать то, что я хочу.

В их демонстрации (http://code.google.com/appengine/docs/python/gettingstarted/templates.html) у них есть 2 класса, которые создают 2 страницы - один - index.html, а другой обрабатывает форму, помещая данные формы в БД, а затем перенаправляя обратно на главную страницу. , который загружает информацию из БД.

Хотелось бы, чтобы на главной странице была форма, где пользователи отправляют строку, на которой выполняются различные операции, и вывод отображается на главной странице.

Проблема в том, что данные из формы, отправленной пользователями, попадают на страницу обработчика формы, и я не могу понять, как вернуть результат на главную страницу.

Ответы [ 5 ]

5 голосов
/ 25 марта 2011

Естественный способ сохранения данных между различными отправками - использование Datastore .
Если в качестве упражнения вы не хотите использовать хранилище данных, вы вынуждены передать данные в представление и прочитать их обратно, используя несколько полей hidden между каждым веб-запросом.

Давайте рассмотрим простой quick & dirty пример: веб-приложение, которое суммирует целые числа один за другим.

application.py

import os
from google.appengine.ext import webapp
from google.appengine.ext.webapp import template
from google.appengine.ext.webapp.util import run_wsgi_app

class Sum(webapp.RequestHandler):
    def get(self):
        path = os.path.join(os.path.dirname(__file__), 'index.html')
        template_values = {"total":0}
        self.response.out.write(template.render(path, template_values))

    def post(self):    
        value = self.request.get("value")
        total = self.request.get("total")
        total = int(total) + int(value)
        path = os.path.join(os.path.dirname(__file__), 'index.html')
        template_values = {"value":value,
                           "total":total
                          }
        self.response.out.write(template.render(path, template_values))

application = webapp.WSGIApplication(
                                 [('/', Sum),
                                  ('/sum', Sum)],
                                 debug=True)

def main():
    run_wsgi_app(application)

if __name__ == "__main__":
    main()

Чтобы передать данные в представление index.html, функция template.render передает переменную словаря, которая переносит результат в представление:

template.render(path_to_the_view, template_values)

index.html

<html>
<body>
  <form action="/sum" method="post">
    <p>
    <label for="value">Value to sum:
    <input type="text" name="value"><br>
    <input type="submit" value="Submit">
    <input type="hidden" name="total" value="{{ total }}">
    </p>
  </form>
  Last value submitted: {{ value }}| Total:{{ total }}
</body>
</html>

В представлении index.html используются словарные клавиши value и total, чтобы показать результат и отправить итоговое значение в контроллер, используя поле hidden.

А вот и результат:

enter image description here

1 голос
/ 24 марта 2011

Я не понимаю, почему вы хотите вернуть вывод на главную страницу.При отправке формы управление переходит в класс обработчика.Теперь вы можете использовать эти данные формы в своем классе requesthandler любым способом, которым хотите.

И если вы хотите, чтобы некоторые данные передавались из этого обработчика запросов на вашу главную страницу, вы создаете глобальные переменные или создаете другую форму со скрытыми входами для передачи данных.Надеюсь, что это ответит на ваш вопрос.

1 голос
/ 24 марта 2011

Если вы используете webapp.requestHandler, request - это объект словаря, который содержит все данные, предоставленные пользователем. Итак, вот как вы получаете данные

class SubmitHandler (webapp.RequestHandler):
  name = self.request.get ('name')
  email = self.request.get ('emil')
  # do whatever

Это предполагает, что 'name' и 'email' являются полями в вашей форме.

1 голос
/ 24 марта 2011

HTML-форма, созданная шаблоном index.html, имеет следующий тег form:

<form action="/sign" method="post">

Это означает, что данные формы будут отправлены на /sign, когда пользователь нажмет кнопку отправки.URL action определяет, какой обработчик используется.Сначала мы просматриваем ваш файл app.yaml, чтобы узнать, какой скрипт будет использоваться для обработки запроса:

handlers:
- url: /.*
  script: helloworld.py

Все URL обрабатываются helloworld.py, поэтому давайте посмотрим:

application = webapp.WSGIApplication(
                                     [('/', MainPage),
                                      ('/sign', Guestbook)],
                                     debug=True)

Исходя из этого, мы видим, что URL /sign обрабатывается обработчиком запросов Guestbook.Если вы хотите, чтобы отправка формы обрабатывалась другой страницей, вам нужно либо изменить страницу, на которую отправляется форма (атрибут action в теге form), либо изменить обработчик запроса, назначенный указанной.

0 голосов
/ 25 марта 2011

Я предлагаю вам использовать форму Ajax, вот ссылка на несколько примеров (с использованием jquery) Обработка формы jjery ajax

В основном вы определяете форму, как обычно, новместо того, чтобы отправлять запрос, отправляющий вас на другую страницу, вы отправляете запрос обработчику сервера, который что-то делает и передает ответ, как правило, в формате json, который затем можно обработать с использованием javascript и обновить главную страницу с результатами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...