绝对的初学者问题:
我有一个模板文件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时,这个参数还没有,因为我还没有渲染到底部框架呢。可能是这种情况吗?
答案 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参数更改为他们喜欢的任何值。如果可以,最好在另一个处理程序中再次从数据库中提取它。