2016-03-25 5 views
0

私はGoogle App Engineの中の私webapp2をアプリケーションでPythonスクリプトを持っている:ページの各リフレッシュしてグローバル変数 - パイソン、webapp2を

x = 0 

class MyHandler(webapp2.RequestHandler): 

     def get(self): 

      global x 
      x = x + 1 
      print x 

(または新規ユーザーを接続) 、カウントは増加します。 Pythonは各要求に対して新しいプロセスを開始しません(しかし私はそれを期待していました)。どのように私はグローバル変数が要求の存続期間だけ持続したいシナリオを扱うことができますか?インスタンス変数を使用することはできますか?

答えて

1

あなたの見た目の動作が期待されます。新しいインスタンスはすべての要求に対して開始されません。

要求オブジェクト、envオブジェクト、またはスレッドローカル変数を使用して、要求の存続期間中にコード内のどこからでもアクセス可能にしたい情報を格納します。 (Environは各リクエストで再作成されるので、安全です)。

スレッドローカルストレージの使用については、Is threading.local() a safe way to store variables for a single request in Google AppEngine?を参照してください。

ここでは、リクエストの存続期間に関する特定の情報を格納するローカルリクエストオブジェクトを格納する例を示します。このコードはすべてあなたのハンドラの中になければなりません。すべての部分はwebapp2のドキュメントに記載されています。ところで、私はwebapp2を使わないので、これはテストされていません。 (私は、ピラミッド/ボボとこのモデルを使用してリクエストレベルのキャッシュを実行します)。

クラスMyHandlerという(webapp2.RequestHandler):

def get(self): 
     req = webapp2.get_request() 
     # you have request in self, however this is to show how you get a 
     # request object anywhere in your code. 


     key = "Some Key" 

     if req: 
      # getting some store value from the environ of request (See WebOb docs) 
      someval = req.environ.get(key,None) 
      if someval : 
       # do something 

     # and setting 
     if req: 
      req.environ[key] = 'some value' 

それをこの方法を行う環境[ 'キー']値が文字列でなければならないという制約があります。

リクエストオブジェクトに任意の値を格納する方法については、Webobドキュメントを参照してください。 http://docs.webob.org/en/stable/reference.html#ad-hoc-attributesからhttp://webapp-improved.appspot.com/api/webapp2.html#webapp2.Request

注意、あなたが要求ハンドラがある外に定義した変数 - あなたはwebapp2を要求オブジェクトのドキュメントの読み取りを持っている場合

req.environ['webob.adhoc_attrs'] 
{'some_attr': 'blah blah blah'} 

はまた、あなたが情報を保存するために使用できるレジストリがあります基本的にキャッシュされ、インスタンスの存続期間に使用可能です。これはあなたが間違っているところです。

/なぜアプリ・レベルのキャッシュがどのように機能するかを理解するために - と、なぜあなたの最初の試みは、あなたがhttps://cloud.google.com/appengine/docs/python/requests#Python_App_caching

+0

を見てやりたいしません申し訳ありませんが、あなたはコードで私を助けることができますか?私はPythonで新しいです... – Dennix