2011-03-24 15 views
3

私は初心者のプログラマーで、App Engineを使って最初のWebアプリケーションを開発していますので、無知を許してください。Google App Engineのページ間でデータを共有するにはどうすればいいですか?

私は、Googleから与えられたHello Worldプログラムを変更して、自分が望むことをやろうとしました。

デモ(http://code.google.com/appengine/docs/python/gettingstarted/templates.html)には2つのクラスがあり、1つはindex.html、もう1つはハンドルフォームには、フォームデータをDBに入れて、メインページにリダイレクトして、DBから情報をロードします。

メインページにユーザーが文字列を送信し、さまざまな操作が実行され、出力がメインページに表示されるフォームが必要です。

問題は、ユーザーが送信したフォームのデータがフォームハンドラページに移動し、出力をメインページに戻す方法がわかりません。

<form action="/sign" method="post"> 

これは、ユーザーが送信ボタンをクリックしたときに、フォームのデータが/signに送られることを意味します。

答えて

5

異なる提出物間でデータを保持する自然な方法は、Datastoreを使用することです。
エクササイズのためにデータストアを使用したくない場合は、データをビューに渡して、各Web要求の間にあるhidden個のフィールドを使用して読み込みます。

簡単に見てみましょうクイック&ダーティー例:整数を1つずつ合計するWebアプリケーションです。

template.render(path_to_the_view, template_values) 

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機能は、ビューに結果を運ぶ辞書変数を渡す使用されています

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ビューは、結果を表示してhiddenフィールドを使用してコントローラに合計を返すために、辞書キーvalueおよびtotalを使用します。ここ

とは結果である:

enter image description here

+0

ああ!私はいくつかの質問があります。 1. 2つの異なるクラスでこれを行うことは可能でしょうか?私はあなたが2つのクラスを1つにまとめたことに気付きました... 2.データストアを使ってクラス間でやりとりする場合、どのように機能しますか?ユーザーAが1つの値、たとえば「3」を提出して提出した場合、合計は3になり、データストアにその値を格納するように見えます。その後、ユーザーBは4を提出し、期待通りに4の代わりに7を返します。ユーザーごとに固有のIDを保存する必要もありますか? – Jeremy

+0

@Jeremy 1)はい - ハンドラクラスは問題ではありません。 2)それはまさにあなたがすでに見ているデモがすることです。 –

+0

@jeremy 1.ニーズを満たす複数のクラスでコードを編成できます。それは本当に重要ではありません。 2.純粋な例でデータストアを使用したい場合は、ユーザーごとに区別する必要があります。 – systempuntoout

1

index.htmlテンプレートによって生成されたHTMLフォームには、以下のformタグを持っています。 action URLは、どのハンドラが使用されるかを決定します。まず、我々は要求を処理するために使用されるスクリプトを参照してくださいapp.yamlファイルを調べ:

handlers: 
- url: /.* 
    script: helloworld.py 

すべてのURLがhelloworld.pyによって処理されているので、そこを見てみましょう:これに基づき

application = webapp.WSGIApplication(
            [('/', MainPage), 
             ('/sign', Guestbook)], 
            debug=True) 

、 URL /signGuestbookリクエストハンドラによって処理されていることがわかります。フォームの提出を別のページで処理したい場合は、フォームが送信されているページ(formタグのaction属性)を変更するか、指定したリクエストハンドラを変更する必要があります。

+0

申し訳ありません - 私はあまり明確ではありませんでした。私が望むのは、メインページのリクエストハンドラからの出力を使用する方法です。それは可能ですか?または、ユーザーをリクエストハンドラページ(この場合は/記号)にリダイレクトするだけですか? – Jeremy

+0

ホームページと/サインページの両方で生成されるべき出力がある場合は、それを別の関数(両方のリクエストハンドラの外、あるいはそれらの静的メソッドの外)にリファクタリングして、 。あるいは、テンプレート継承を使用してこの効果を得ることもできます。あなたがしようとしていることに依存します。 –

1

なぜメインページに出力を戻したいのか理解できません。フォームを送信すると、コントロールはハンドラクラスに移動します。このフォームデータは、リクエストハンドラクラスで任意の方法で使用できます。

このリクエストハンドラからメインページにデータを転送する場合は、グローバル変数を作成するか、隠れた入力を持つ別のフォームを作成してデータを転送します。あなたの質問に答えてくれることを願っています。

+0

これはまさに私がやりたいことです。無知になって申し訳ありませんが、グローバル変数を作成してメインページクラスに戻すにはどうしたらいいですか? – Jeremy

+0

グローバル変数?何だって? –

+0

@Jeremy:var1 = Noneのようなimport文の後に定義する必要があるグローバル変数を作成するのを参照してください。そして、それを使用する関数でグローバル変数var1のように定義する必要があります。これがあなたの問題を解決することを願っています。 – niteshb

1

webapp.requestHandlerを使用している場合、リクエストは、ユーザーが送信したすべてのデータを含む辞書オブジェクトです。あなたは

class SubmitHandler (webapp.RequestHandler): 
    name = self.request.get ('name') 
    email = self.request.get ('emil') 
    # do whatever 

データを取得する方法だから、こここれは「名前」と「メール」は、フォーム内のフィールドであることを前提としています。

0

私はここで、あなたはAjaxのフォームを使用することをお勧め(jqueryのを使用して)いくつかの例 jquery ajax form handling

へのリンクは基本的にフォームを定義していますあなたが通常どおりにやっているように、ポストリクエストの代わりに別のページにあなたを送るときは、何かをするサーバハンドラにリクエストを投稿し、通常はjson形式のレスポンスを返すので、javascriptを使って処理し、結果。

関連する問題