2017-02-13 58 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

相关问题