2017-02-13 80 views
3

以下是完整的錯誤:請求的會話在請求完成之前被刪除。例如,用戶可能已經註銷併發請求。Django/Memcached錯誤:請求的會話在請求完成之前被刪除

我正在使用python-memcached與我的會話使用我的緩存。每隔幾天我就會遇到其中一個錯誤。它由request.session.save()上的UpdateError拋出。它來自session/middleware.py中的第60行。 99%的時間一切正常。我在許多不同的URL上看到了有關GET和POST請求的錯誤。用戶報告他們沒有點擊註銷按鈕。他們還報告說,這發生在登錄後5分鐘,所以他們的會話不會過期。我的緩存已經運行了一個多月,我的驅逐次數爲0。如果我谷歌這個錯誤,它似乎沒有人曾經得到過它。

我想連接到memcached可能會因爲某種原因關閉。它在localhost上運行。我唯一一次看到這個錯誤是當我將緩存配置設置爲一個服務器,該服務器正在運行memcached但它不在該接口上偵聽。這會在每個請求中生成這個確切的異常。那麼有沒有辦法讓memcache拒絕監聽第二或第二個連接或丟棄連接?

這裏是我的設置:

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 

看來肯定的方式導致此錯誤是請求運行時,運行在一個shell會話密鑰cache.delete。所以有些東西在刪除緩存鍵。我不知道它的Django或Memcached。 Memcached的確說STAT evictions 0

+2

我遇到同樣的問題 - 現在好像有三個人在互聯網上有這個問題。 ;)可能是四個。 – Teekin

+0

@Teekin我沒有得到它了。我要檢查的是升級memcached,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

這似乎是一個非常hacky的解決方案。對於丹尼爾來說,這並不令人驚訝,因爲它可能會對環境做出很多假設。 – Teekin

+1

@Teekin哦,是的,它非常非常黑。我一點都不自豪。這是我花了幾個小時在這之後想出來的,並且無處可去。它是一個非常間歇性的問題,幾乎不可能複製,因此很難診斷。 – kagronick

相關問題