2017-02-13 5 views
3

完全なエラーです:リクエストが完了する前にリクエストのセッションが削除されました。ユーザーは、たとえば、同時要求でログアウトしている可能性があります。Django/Memcachedエラー:リクエストが完了する前にリクエストのセッションが削除されました

私のキャッシュを使ってセッションでpython-memcachedを使用しています。数日おきにこれらのエラーの1つが発生します。 request.session.save()のUpdateErrorによってスローされます。これはsessions/middleware.pyの60行目から来ます。時間の99%が正常に動作します。私はGETとPOSTリクエストのために多くの異なるURLでこのエラーを見ました。ユーザーは、ログアウトボタンをクリックしていないことを報告します。また、ログイン後5分でセッションが終了することを報告しています。私はキャッシュが1ヶ月以上実行されている間、0個のエビクトをキャッシュに残しています。私がこのエラーをGoogleに伝えた場合、これまでに誰もそれを入手したことがないようです。

memcachedへの接続が何らかの理由で閉じている可能性があります。そのローカルホスト上で実行されます。私はこのエラーを見た唯一の他の時間は、memcachedを実行していたサーバーにキャッシュ設定を設定しても、そのインターフェースでリッスンしていないときです。これは、すべての要求に対してこの正確な例外を生成します。では、memcacheが2番目または2番目の接続を拒否したり、接続を切断したりすることを拒否する方法はありますか?ここで

は私の設定です:

CACHES = { 
    'default': { 
     'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', 
     'LOCATION': '127.0.0.1:11211', 
     'TIMEOUT': 1209600, # Two weeks 
    }, 
} 

SESSION_SAVE_EVERY_REQUEST = True 
SESSION_ENGINE = "django.contrib.sessions.backends.cache" 
SESSION_COOKIE_SECURE = CSRF_COOKIE_SECURE = True 
SESSION_COOKIE_AGE = 60 * 90 # In 90 minutes 

このエラーを発生させる確実な方法は、要求の実行中のシェルのセッションキーでcache.deleteを実行することであるようです。だから何かがキャッシュキーを削除しています。私はそのDjangoかMemcachedかわからない。 MemcachedはSTAT evictions 0と言っています。

+2

私は同じ問題を抱えています - そして、この問題を抱えているインターネット上に正確に3人の人がいるようです。 ;)おそらく4つ。 – Teekin

+0

@Teekinもう私はそれを取得していません。私がチェックするのは、memcached、あなたのWebサーバー用のファイル記述子、およびそれらのそれぞれが実行中のユーザーをアップグレードすることです。 memcahedをローカルソケットで実行させる。下に貼り付けたミドルウェアを追加します。 – kagronick

+0

私は最近、このエラーを生成するビューが、ほとんどがajaxスクリプトによって呼び出されていること、またはファイルを処理していることがわかりました。私の場合、ユーザーが同時リクエストでログアウトする可能性は間違いありません。このエラーメッセージを常に防止したいだけです。 –

答えて

0

私はこのミドルウェアを使って問題を解決しました。それはそれを世話したようだ。また、ファイル記述子の制限を確認してください。

class SLSessionMiddleware(SessionMiddleware): 
    """ 
    Fixes a bug where sessions sometime fail to be set. Catches the error 10 times and gives up. 
    """ 

    def process_response(self, request, response): 

     last_exception = None 
     for i in range(10): 
      try: 
       return super().process_response(request, response) 
      except Exception as e: 
       request.session.cycle_key() 
       time.sleep(1) 
       last_exception = e 

     raise last_exception 
+1

これは非常に面白い解決策のようです。ダニエル・Kのためにはうまくいかないと私は驚いていません。おそらく、環境についての多くの仮定をしているからです。 – Teekin

+1

@Teekinああ、はい、それは非常に非常にハッキーです。私はそれを全く誇りに思いません。私はこれに時間を費やしてどこにもいなくなった後に思いつきました。非常に間欠的な問題であり、再現することはほとんど不可能であり、診断することは非常に困難です。 – kagronick

関連する問題