Google app engine 如何在Google App Engine上的页面之间共享数据
我是一个新手程序员,正在开发我的第一个web应用程序(使用应用程序引擎),所以请原谅我的无知 我一直在修改谷歌提供的Hello World程序,试图让它做我想做的事情 在他们的演示中(http://code.google.com/appengine/docs/python/gettingstarted/templates.html)它们有两个类,创建两个页面——一个是index.html,另一个处理表单,方法是将表单数据放入数据库,然后重定向回主页,主页从数据库加载信息 我希望在主页上有一个表单,用户在其中提交一个字符串,在该字符串上执行各种操作,并在主页上显示输出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,另一个处理表单,方法是将表单数据放入数据库,然后重定向回主页,主页从数据库加载信息 我希望在主页上有一个表单
问题是,用户提交的表单中的数据会进入表单处理程序页面,我不知道如何将输出返回主页。由
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>