2009-07-11 2 views
0

絶対初心者の質問:Google App Engine:リクエストハンドラに値を渡すには?

... 
<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ファイルを持っていますindex.htmlを生成するために使用された値{{bottom_frame_url}}を持っていますが、この値をTopFrameリクエストハンドラに渡す方法はわかりますか?

ありがとうございます!

編集:私たちはindex.htmlをテンプレートに "/ top_frameを" 遭遇したときしかし、私の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をレンダリングしています

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')は値を読み取っていないようです。

NameError: global name 'bottom_frame_url' is not defined 

それを:私は、私はページをレンダリングする際に下のフレームは、私が設定され、ウェブサイトとして示しているが、トップフレームは次のエラーで終わるトレースバックを表示するため、値が私のindex.htmlをテンプレートに設定されている知っています私のindex.htmlテンプレートにいくつかのコードを入れて、bottom_frame_urlの値をTopFrameリクエストハンドラに明示的に渡す必要があるようです。これは正しいです?

私が考えることができるもう一つのことは、bottomframe_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要求のパラメータのみを取得できます。設定には3つのHTTPリクエストがあります.1つはフレームセット(ハンドラがどのURLであっても)、1つはトップフレーム(URL「/ top_frame」)、1つはボトムフレーム(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パラメータを好きな値に変更できるようにするときは、常に覚えておいてください。可能であれば、もう一方のハンドラでデータベースから再度プルするほうが良いかもしれません。