2012-12-27 10 views
6

私のアプリでdjangoセッションで奇妙なバグがあります:ユーザーのセッション情報が消去されることがあります(約10回〜約20000件)。私はログファイルを介してそれを追跡しました。ページAにはユーザーのセッションに関する情報があり、フォームを送信した後、次のページでセッションが空です。私はmemcached + dbとdbの2種類のストレージを試しましたが、この問題は両方のためです。私はこれらのシナリオを再現しようとしましたが、期待どおりの作品は、私が言ったように、非常にまれです。私はまた、この問題がさまざまなユーザーのために存在することを確認しました。そのため、毎回この問題が再現されません。私は根本的な原因を突き止める方法はありませんし、他に何が記述されているのか分かりません。誰かがアイデアを持っているなら、私に知らせてください。重要なのなら、私はdjango 1.2 + FastCGIを使って自分のアプリケーションを実行しています。 ありがとう!djangoセッションの難しい問題:セッション情報が消去されることがある

UPD:2つのシーケンシャルリクエストの間に、セッションキーが変更されていないことを確認しました。最初のリクエストでは実際のセッション状態があり、2番目のセッション変数は空に再配置されます。この問題をデバッグするための方法として

+0

同時リクエストを発信できるjavascriptを使用して、両方がセッションを変更できるようにしていますか? – hynekcer

+0

@hynekcerでは、JSからの呼び出しでセッションは更新されません。 – dbf

+0

FastCGIでマルチスレッドを使用していませんか? (FCGI_MAX_CONNS = 1、FCGI_MAX_REQS = 1、FCGI_MPXS_CONNS = 0を設定すると、使用するfastcgiの実装に依存して、単一のスレッドのみを使用することができます。[FastCGI specification](http://www.fastcgi.com/drupal/node/6?q = node/22))次に、プロセスIDのログを記録して、同じプロセスでのみ消去できるか、別のプロセスでのみ消去できるかを確認することをお勧めします。 (ロギングフォーマット文字列や "os.getpid()"関数で "%(process)d"を使用してください。) – hynekcer

答えて

4

、私は標準のDjangoのセッションミドルウェアをサブクラス化します(または、あなたが現在使用しているものは何でも):

django.contrib.sessions.middleware.SessionMiddleware

と(おそらくもっと重要な)process_requestとをラップprocess_responseでいくつか余分なロギング。次に、Djangoの株式ではなく、サブクラス化されたセッションミドルウェアをMIDDLEWARE_CLASSESにインストールします。

また、session.save()が実際にその変更を読み取って変更を確定したことを検証することもできます。問題はセッション状態のシリアル化にあり、ストアしようとしている特定のキーまたは値に問題がある可能性があります。

これはあなたの問題を解決するものではありませんが、何が起こっているのかを確認するのに役立ちます。

4

@Steve Mayneが述べたように、セッションミドルウェアとセッションモデルの保存方法でいくつかのロギングを行うとよいでしょう。それは私がまず始めるべきことです。

さらに、これはデータベース関連の問題であると言いたいと思います。特に、セッションにMySQLデータベースのバックエンドを使用している場合は、ログでデータベースのロックやその他の並行性の問題を確認できます。以前は同様の問題に対処しなければならず、解決策は明らかです。最適化と追加のパフォーマンスです。

特定のアプリケーションミドルウェアをお持ちの場合は、Djangoセッションを妨害する機能をチェックできます。このような並列操作は、正しく実装されていないと問題を引き起こす可能性があります。

最新の安定版のDjangoにアップグレードし、mod_wsgiセットアップに移行することもできます。

関連する問題