【发布时间】:2017-02-13 18:33:38
【问题描述】:
这是完整的错误:请求的会话在请求完成之前被删除。例如,用户可能已在并发请求中注销。
我在使用我的缓存的会话中使用 python-memcached。每隔几天我就会遇到这些错误之一。它由 request.session.save() 上的 UpdateError 引发。它来自 session/middleware.py 中的第 60 行。 99%的时间一切正常。我在 GET 和 POST 请求的许多不同 URL 上都看到了这个错误。用户报告他们没有单击注销按钮。他们还报告说这发生在登录后 5 分钟,因此他们的会话不会过期。我的缓存已经运行了一个多月,有 0 次驱逐。如果我用谷歌搜索这个错误,看起来以前没有人得到过它。
我认为与 memcached 的连接可能由于某种原因而关闭。它在本地主机上运行。我看到此错误的唯一一次是当我将缓存配置设置为运行 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。
【问题讨论】:
-
我遇到了同样的问题 - 现在互联网上似乎正好有三个人遇到了这个问题。 ;) 可能是四个。
-
@Teekin 我不明白了。我要检查的事情是升级 memcached、memcached 的文件描述符和您的 Web 服务器,以及每个运行的用户。使 memcahed 通过本地套接字运行。并添加我在下面粘贴的中间件。
-
我最近注意到产生此错误的视图主要由 ajax 脚本调用或它们处理文件(例如返回图像)。就我而言,用户肯定有可能在并发请求中注销 - 我只是想一直防止出现此错误消息。
-
然后在你的设置文件中给它一个空处理器。
-
在我刚刚调用 set_autocommit(False)、commit() 等之后,我得到了这个错误。我扭转了一切。但没有成功解决。奇怪的问题。
标签: django memcached python-memcached