Естественный способ сохранения данных между различными отправками - использование 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](https://i.stack.imgur.com/qbySR.png)