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

Google app engine 如何在Google App Engine上的页面之间共享数据,google-app-engine,web-applications,Google App Engine,Web Applications,我是一个新手程序员,正在开发我的第一个web应用程序(使用应用程序引擎),所以请原谅我的无知 我一直在修改谷歌提供的Hello World程序,试图让它做我想做的事情 在他们的演示中(http://code.google.com/appengine/docs/python/gettingstarted/templates.html)它们有两个类,创建两个页面——一个是index.html,另一个处理表单,方法是将表单数据放入数据库,然后重定向回主页,主页从数据库加载信息 我希望在主页上有一个表单

我是一个新手程序员,正在开发我的第一个web应用程序(使用应用程序引擎),所以请原谅我的无知

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

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

我希望在主页上有一个表单,用户在其中提交一个字符串,在该字符串上执行各种操作,并在主页上显示输出


问题是,用户提交的表单中的数据会进入表单处理程序页面,我不知道如何将输出返回主页。

index.HTML
模板生成的HTML表单具有以下
表单
标记:

<form action="/sign" method="post">
所有URL都由
helloworld.py
处理,因此让我们看看:

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

基于此,我们可以看到
/sign
URL由
留言簿
请求处理程序处理。如果希望表单提交由其他页面处理,则需要更改表单提交到的页面(表单标签中的
操作
属性),或者更改分配给指定页面的请求处理程序。

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


如果您希望一些数据从这个requesthandler传输到您的主页面,您可以创建全局变量或创建另一个带有隐藏输入的表单来传输数据。希望这能回答你的问题

如果您使用的是webapp.requestHandler,request是一个字典对象,其中包含用户提交的所有数据。所以,这里是如何获得数据的

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

这假设“name”和“email”是表单中的字段。

在不同提交之间保存数据的自然方法是使用。
如果出于练习,您不想使用数据存储,则必须将数据传递到视图,并在每个web请求之间使用一些
隐藏的
字段将其读回

让我们看一个简单、快速、肮脏的例子:一个逐个求整数和的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>


要求和的值:

提交的最后一个值:{{value}}总计:{{Total}
index.html
视图使用字典键
value
total
显示结果,并使用
hidden
字段将总计提交回控制器

结果如下:


我建议您使用Ajax表单,下面是几个示例的链接(使用jquery)


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

这正是我想要做的-很抱歉不知道,但是我如何创建一个全局变量并将其传回mainpage类,或者创建一个带有隐藏输入的表单并将其传回?@Jeremy:See要创建全局变量,您需要在诸如var1=None之类的导入语句之后定义它,并且在任何要使用它的函数中,您都必须将其定义为global var1。希望这能解决你的问题。对不起,我不是很清楚。我想要的是一种使用主页面上请求处理程序的一些输出的方法。这是可能的,还是我应该将用户重定向到请求处理程序页(/sign,在这种情况下)?如果您需要在主页和/sign页上生成一些输出,那么您可能可以将其重构为一个单独的函数(在两个请求处理程序之外,或者作为其中一个请求处理程序的静态方法)并从这两个页面调用它。或者,您可以使用模板继承来实现此效果。取决于你想做什么。啊!我有几个问题。1.有可能用两个不同的类来实现这一点吗?我注意到你把两门课合二为一。。。2.如果您使用数据存储来跨类通信,那么该如何工作?看起来,如果用户A提交了一个值,比如说“3”,并提交了它,那么总数将等于3,您将把它存储在数据存储中。然后,用户B提交了4,它将为他返回7,而不是预期的4。您是否还需要为每个用户存储一个唯一的ID?@Jeremy 1)是的-它所在的处理程序类并不重要。2) 这正是你正在看的演示所做的。@jeremy 1。您可以将代码组织在几个类中,以满足您的需要;这并不重要。2.如果您想在我的简单示例中使用数据存储,是的,您应该区分每个用户。
<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>