2009-07-11 79 views
0

绝对初学者问题: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') 
     ... 

由于你可以看到,我想拥有的价值{{bottom_frame_url}}这是用来生成我的index.html,但如何我这个值传递给我的TopFrame请求处理?

谢谢!

编辑:

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请求处理程序被称为:我从另一个请求处理程序渲染的index.html

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这种说法尚未公布,因为我还没有呈现底部框架呢。情况会是这样吗?

回答

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参数更改为他们喜欢的任何值。如果可以的话,最好从另一个处理程序中将其从数据库中拉出来。

相关问题