Google App Engine:如何将值传递给我的请求处理程序?

时间:2009-07-11 18:45:11

标签: http google-app-engine

绝对的初学者问题:

我有一个模板文件index.html,如下所示:

...
<FRAMESET ROWS="10%, *">
    <FRAME SRC="/top_frame">
    <FRAME SRC="{{ bottom_frame_url }}">
</FRAMESET>
...

/ top_frame的请求处理程序如下所示:

class TopFrame(webapp.RequestHandler):
    def get(self):
        ...
        bottom_frame_url = self.request.get('bottom_frame_url')
        ...

正如您所看到的,我希望获得用于生成index.html的值{{bottom_frame_url}},但是如何将此值传递给我的TopFrame请求处理程序?

谢谢!

编辑:我正在从另一个请求处理程序呈现index.html:

class MainPage(webapp.RequestHandler):
def get(self):
    ...
    bottom_frame_url = Site.qql("WHERE Category = :1 ORDER BY date DESC",category_name)
    ...
    args = {
      ...
      'bottom_frame_url': bottom_frame_url,
      ...
    }
    index_path = os.path.join(os.path.dirname(__file__), 'index.html')     
    self.response.out.write(template.render(index_path, args))

但是当我们在index.html模板中遇到“/ top_frame”时,我的TopFrame请求处理程序被调用:

class TopFrame(webapp.RequestHandler):
def get(self):
    ...
    bottom_frame_url = self.request.get('bottom_frame_url')
    ...
    args = {
        'bottom_frame_url': bottom_frame_url
    }
    self.response.out.write(template.render('topframe.html', args))

但是self.request.get('bottom_frame_url')似乎没有读取任何值。我知道我的index.html模板中已经设置了值,因为当我渲染页面时,底部框架显示为我设置的网站,但顶部框架显示以下面错误结束的回溯:

NameError: global name 'bottom_frame_url' is not defined

看起来我必须在index.html模板中添加更多代码,以便将bottom_frame_url的值显式传递给我的TopFrame请求处理程序。这是对的吗?

我能想到的另一件事是虽然我传递bottom_frame_url作为渲染index.html的参数,但当我尝试渲染topframe.html时,这个参数还没有,因为我还没有渲染到底部框架呢。可能是这种情况吗?

1 个答案:

答案 0 :(得分:2)

这是渲染模板的调用的参数:

args = {
    bottom_frame_url: self.request.get('bottom_frame_url')
}
self.response.out.write(template.render('index.html', args))

请参阅http://code.google.com/appengine/docs/python/gettingstarted/templates.html

编辑:对不起,我误解了这个问题。我认为包含您显示的代码的请求处理程序是框架集的请求处理程序,但我现在看到它不是。

self.request.get只能获取当前HTTP请求的参数。您的设置将导致三个HTTP请求:一个用于框架集(具有处理程序所在的任何URL),一个用于顶部框架(具有URL“/ top_frame”),一个用于底部框架(具有由bottom_frame_url指定的URL)第一个HTTP请求的参数)。第二个和第三个不一定按顺序发生,并且可能存在对图像的其他请求等。但是顺序对顶部框架处理程序在self.request.get中看到的内容没有影响。每个请求都会导致您的app.yaml被查询,并运行相应的Python脚本,并调用其中的相应处理程序。每个请求的参数仅为查询字符串中设置的参数或该一个请求的POST参数。

因此,如果您希望顶部框架的处理程序通过self.request.get查看bottom_frame_url,则必须将其添加为请求的URL参数,这会导致顶部框架处理程序运行。将模板更改为:

<FRAMESET ROWS="10%, *">
    <FRAME SRC="/top_frame?bottom_frame_url={{bottom_frame_url}}">
    <FRAME SRC="{{ bottom_frame_url }}">
</FRAMESET>

现在,当浏览器请求顶部框架时,您将能够使用self.request.get('bottom_frame_url')在该处理程序中访问它,就像您在框架集的处理程序中所做的那样。

永远记住,在做这种事情时,用户可以将URL参数更改为他们喜欢的任何值。如果可以,最好在另一个处理程序中再次从数据库中提取它。