12

TornadoWebサーバーのユースケースは次のとおりです。

POST要求時に、サーバーにエントリを作成できます。エントリは、ファイルまたはデータベースに永続化されません。GETリクエストに応じて、プロセスを開始または終了できます。

RequestHandlerしたがって、実装では異なるリクエスト間でデータを共有する必要があります。そうするための通常の方法は何ですか?

selfたとえば、データをに保存するのに苦労しましself.entry = "..."た。別のリクエストでは、データはもう存在しませんでした。

私が見つけた唯一の実用的な解決策は、それをアプリケーションオブジェクトに保存することです。

    application = web.Application([
            (r'.*', MainHandler,
            ])

    def get(self):
         # ...
         self.application.entry = "..."

それは正しい方法ですか?また、ここでの同期については、これは共有データへのアクセスを意味します。

4

4 に答える 4

17

次のことをお勧めします。データベースアクセスオブジェクトの代わりに、データを格納するオブジェクトを渡します。たとえば、次のようになります。

data = DataStore()

application = web.Application([
        (r'.*', MainHandler, dict(data = data),
        ])

次のRequestHandler初期化方法を使用します。

def initialize(self, data):
     self.data = data

前にオブジェクトを作成して渡す必要があります。そうしないと、リクエストが処理されるたびにオブジェクトが再作成されます。

于 2012-09-03T11:32:58.583 に答える
6

ドキュメントはこれを行う方法を提供します:

class MyHandler(RequestHandler):
    def initialize(self, database):
        self.database = database

    def get(self, username):
        ...

mydatabase = dict()

app = Application([
    (r'/user/(.*)', MyHandler, dict(database=mydatabase)),
    ])

次に、オブジェクトmydatabaseをファイルに保存できます。

しかし、これがリクエスト間の同期に関してあなたが望むことを達成するための正しい方法であるかどうかはわかりません。

于 2012-09-03T07:20:12.827 に答える
1

あなたはmemcachedこのようなものに使うことができます。ただし、me​​mcachedサーバーをセットアップする必要があります。

http://pypi.python.org/pypi/python-memcached/

于 2012-09-03T05:31:38.860 に答える
1

アプリケーションは、(半)永続的なデータを格納するための適切なオブジェクトです。ただし、他の回答で提案されているように、このデータを格納するために何らかのデータベースの使用を検討する必要があります。

ただし、セッション(またはトランザクション)が適切に終了しない場合(たとえば、POSTを取得しても、アクションをトリガーするGETがない場合)、Webサーバーがメモリをリークしないようにセッションデータを削除する必要があります。

私の経験から、Redisを使用することをお勧めします。これは、使いやすく、セッションデータを管理する必要がある場合に便利なメカニズムであるキーの有効期限をサポートしているためです。

于 2012-09-03T06:43:25.027 に答える