我是一名新手程序员,在我的第一个网络应用程序(使用App Engine)上工作,所以请原谅我的无知。
我一直在修改Google提供的Hello World程序,试图让它做我想做的事。
在他们的演示中(http://code.google.com/appengine/docs/python/gettingstarted/templates.html),他们有2个类可以创建2个页面 - 一个是index.html,另一个是处理表单,将表单数据放入DB,然后重定向回主页,从主页加载信息。
我想在主页面上有一个表单,用户提交一个字符串,执行各种操作,输出显示在主页面上。
问题是用户提交的表单中的数据会转到表单处理程序页面,我无法弄清楚如何将输出返回到主页面。
答案 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
视图使用字典键value
和total
来显示结果,并使用hidden
字段将总数提交给控制器。
结果如下:
答案 1 :(得分:1)
index.html
模板生成的HTML表单包含以下form
标记:
<form action="/sign" method="post">
这意味着当用户点击提交按钮时,表单的数据将发送到/sign
。 action
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并使用结果更新主页。