2016-11-30 1 views
1

現在、SESSION_ENGINEをuser_sessions.backends.db(私はthis外部ライブラリを使用しています)と設定されたDjangoアプリケーションを実行しています。 Django自身のビルトインセッションは素晴らしいですが、すべてのデータはbase64でエンコードされたデータに隠されています。このライブラリは、セッションオブジェクトを他のORMオブジェクトのようにアクセス可能にします。カスタムバックエンドからキャッシュバックエンドにセッ​​ションデータを移行する(Django)

このライブラリの依存関係を削除する必要があります。性能向上のためキャッシュにセッションエンジンを変更しました。

この変更を現在のセッションデータを破損することなくに変更しています。これはこの質問に関するものです。その性質上、ライブラリには当然db以外のバックエンドは含まれていないので、私はそれを拡張する必要があります。

どのようにこの問題にアプローチする必要がありますか?例えば、私の頭では:i)このライブラリがセッションデータを保存するdbテーブルの内容を調べるべきである、ii)書き込みごとにこのデータをキャッシュメモリに保存する機能を書く、iii)読み込みに移行するキャッシュから(フォールバックとしてのdbを使用して)

これは正しいと思われますか?これはかなり複雑な作業なので、この時点では何も知らないことが大好きです。前もって感謝します。

+0

私はこれをやります:この現在のセッションデータをDjangoのセッションデータにシリアル化する方法を理解します。現在のセッションIDをDjangoのセッションフレームワークが使用するキーに直接マッピングできるかどうかを確認してください。すべてのセッションデータを新しいセッションストレージに移行します。古いセッションエンジンのクッキーキーを新しいセッションエンジンに変換するためのミドルウェアを作成し、Djangoのセッションエンジンに透過的にします。 (キーを再利用できない場合は、マップold_key => new_keyをDjangoのキャッシュに書き込み、それを照会してください)。 – Tiago

答えて

0

私の意見では、同じセッションIDを維持しながら、すべてのセッションデータを再シリアル化するだけで、すべての現在のセッションデータをネイティブのDjangoセッションフレームワークに移行するのが最も良い方法です。

まず、Sessionフレームワークがデータをシリアル化する方法を正確に把握したいと思います。例えば、Django 1.10.4では、here's what you should be looking for: django/contrib/sessions/backends/base.py#L96です。

次に、データベースから現在のセッションデータを読み取り、それをネイティブのものに変換するコンバータを作成します。

セッションIDの仕組みはよく分かりませんが、同じ種類のIDを使用しているように見えますので、これにするだけでSESSION_ENGINEMIDDLEWARE_CLASSESをDjangoのデフォルトに戻してくださいうまくいくはずです。

関連する問題