如何在Google App Engine上的页面之间共享数据

时间:2011-03-24 04:55:26

标签: google-app-engine web-applications

我是一名新手程序员,在我的第一个网络应用程序(使用App Engine)上工作,所以请原谅我的无知。

我一直在修改Google提供的Hello World程序,试图让它做我想做的事。

在他们的演示中(http://code.google.com/appengine/docs/python/gettingstarted/templates.html),他们有2个类可以创建2个页面 - 一个是index.html,另一个是处理表单,将表单数据放入DB,然后重定向回主页,从主页加载信息。

我想在主页面上有一个表单,用户提交一个字符串,执行各种操作,输出显示在主页面上。

问题是用户提交的表单中的数据会转到表单处理程序页面,我无法弄清楚如何将输出返回到主页面。

5 个答案:

答案 0 :(得分:5)

在不同提交之间保留数据的自然方法是使用Datastore 如果为了练习,您不想使用数据存储区,则必须使用每个Web请求之间的一些hidden字段将数据传递给视图并将其读回。

让我们看一个简单的 quick& dirty 示例:一个逐个求和的Web应用程序。

<强> 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视图使用字典键valuetotal来显示结果,并使用hidden字段将总数提交给控制器。

结果如下:

enter image description here

答案 1 :(得分:1)

index.html模板生成的HTML表单包含以下form标记:

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

这意味着当用户点击提交按钮时,表单的数据将发送到/signaction URL确定使用哪个处理程序。首先,我们查看您的app.yaml文件,以查看将使用哪个脚本来处理请求:

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

所有网址都由helloworld.py处理,所以让我们看看:

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

基于此,我们可以看到/sign URL由Guestbook请求处理程序处理。如果您希望表单提交由不同的页面处理,您需要更改提交表单的页面(action标记中的form属性)或更改分配的请求处理程序到指定的。

答案 2 :(得分:1)

我不明白为什么要将输出返回到主页。在提交表单时,控件将转到处理程序类。现在,您可以以任何您想要的方式在requesthandler类中使用此表单数据。

如果您希望将一些数据从此请求处理程序传输到您的主页,您可以创建全局变量或创建另一个带有隐藏输入的表单来传输数据。希望这会回答你的问题。

答案 3 :(得分:1)

如果您使用的是webapp.requestHandler,请求是一个字典对象,其中包含用户提交的所有数据。那么,这是你获取数据的方式

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

这假定'name'和'email'是表单中的字段。

答案 4 :(得分:0)

我建议您使用Ajax表单,这里是一些示例的链接(使用jquery) jquery ajax form handling

基本上你正如你通常所做的那样定义一个表单,而不是将你发送到另一个页面的post请求,你将请求发布到服务器处理程序,它执行某些操作并通常以json格式传回响应,然后您可以处理使用javascript并使用结果更新主页。

相关问题