14

そこで、「ベストアンサーがない」という問題を回避するために、最善の方法ではなく、Tornado フレームワークを使用する際にセッションを処理するための標準的または最も一般的な方法について質問します。つまり、サード パーティの認証 (OAuth など) を使用しておらず、ブラウザーに安全な Cookie を含む独自の Users テーブルが必要であるが、ほとんどのセッション情報はサーバーに保存されている場合、これを行う最も一般的な方法は?Redis を使っている人もいれば、通常のデータベース (MySQL や Postgres など) を使っている人もいれば、memcached を使っている人もいます。

私が取り組んでいるアプリケーションには、一度に数百万、あるいはおそらく数千のユーザーがいるわけではありません。ただし、最終的にはある程度複雑な認証スキームを取得する必要があります。私が探しているのは、一般的な Tornado コミュニティとは異なる道をたどる「奇妙な」ことをしないようにすることです。認証と承認は、必要なものではありますが、必要なものではないからです。それは私たちの製品の核心であり、私たちが差別化すべき場所ではありません。したがって、私たちはほとんどの人 (Tornado を使用している) がこの点で何をしているのかを探しています。したがって、(理論的には) 客観的に正しい答えがある質問だと思います.

もちろん、理想的な答えはサンプルコードを指すでしょう。

4

4 に答える 4

17

他のマイクロ フレームワークがセッションを処理する方法を次に示します (CherryPy、Flask など)。

  1. session_idセッションごとに追跡したいその他のフィールドを保持するテーブルを作成します。一部のフレームワークでは、この情報をユーザーごとにファイルに保存したり、メモリに直接保存したりできます。アプリケーションが十分に小さい場合は、これらのオプションも検討できますが、データベースは独自に実装する方が簡単です。
  2. リクエストが受信されたとき(RequestHandler initialize()機能だと思いますか?)、session_id Cookieがない場合は、ランダムジェネレーターを使用して安全なセッションIDを設定します。Tornado の経験はあまりありませんが、安全な Cookie を設定すると便利なようです。そのsession_id情報と関連情報をセッション テーブルに保存します。ログインしていない場合でも、すべてのユーザーがセッションを持つことに注意してください。ユーザーがログインするとき、ログイン状態 (およびユーザー名/user_id など) をセッションに添付する必要があります。
  3. 初期化関数で、RequestHandlersession_id Cookie がある場合は、必要なセッション情報を DB から読み込み、独自の Session オブジェクトを作成して、そのリクエスト ハンドラーのメンバー変数として設定および保存します。

セッションは、一定量の非アクティブ状態が続くと期限切れになることに注意してください。そのため、それも確認する必要があります。「remember me」タイプのログイン状況が必要な場合は、安全な Cookie を使用してそれを通知する必要があります (OWASP でこれを読んで、できるだけ安全であることを確認してください。Tornado の secure_cookie が役立つように思えます)タイムアウトしたセッションを受信すると、新しいセッションを作成し、古いセッションから関連情報を転送することで、新しいユーザーを再認証できます。

于 2013-05-01T14:59:03.300 に答える
14

ステートレスになるように設計された Tornado は、そのままではセッションをサポートしていません。

セキュア Cookie を使用して、user_id などの機密情報を保存します。重要でない情報を保存するには、標準の Cookie を使用します。

大きなオブジェクトを格納するには、標準のスキーム (MySQL + memcache) を使用します。

于 2013-03-07T07:36:10.600 に答える
4

セッションの重要な問題は、セッションを保存する場所ではなく、インテリジェントに期限切れにする方法です。セッションが保存される場所に関係なく、保存されるセッションの数が適切である限り (つまり、アクティブなセッションと余剰セッションのみが保存される)、このデータはすべて RAM に収まり、高速に提供されます。古いジャンクがたくさんある場合、予測できない遅延が発生する可能性があります (セッションをロードするためにディスクをヒットする必要があります)。

于 2013-05-02T20:17:29.550 に答える
3

この目的のために Tornado に直接組み込まれているものはありません。他の人がすでにコメントしているように、Tornado は非常に高速な非同期フレームワークになるように設計されています。無駄のないデザインです。ただし、独自のセッション管理機能をフックすることは可能です。セッション コンテナーを作成または取得する各ハンドラーにプリアンブル セクションを追加する必要があります。セッション ID を Cookie に保存する必要があります。厳密に HTTPS でない場合は、安全な Cookie を使用することをお勧めします。セッションの永続性は、Redis、Postgres、MySQL、ファイル ストアなど、選択した任意のテクノロジにすることができます...

Tornado のセッション管理を提供する Github プロジェクトがあります。使用しないことにした場合でも、独自のセッション管理を構築する方法についての洞察を得ることができます。Github プロジェクトは、dustdevilと呼ばれます。完全な開示 - これは数年前に作成されましたが、非常に使いやすく、現在も積極的に使用されています。

于 2016-03-10T14:04:26.587 に答える