我最近从数据库支持的会话迁移到使用pylibmc通过memcached存储的会话。
这是我的CACHES,SESSION_CACHE_ALIAS&我的settings.py中的SESSION_ENGINE
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache',
'LOCATION': ['127.0.0.1:11211'],
}
}
SESSION_CACHE_ALIAS = 'default'
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
一切都在幕后工作正常,我可以看到它正在使用新的缓存系统。从pylibmc运行get_stats()方法向我显示了缓存中当前项目的数量,我可以看到它已经上升了1.
问题是我无法使用pylibmc手动获取会话。
检查views.py中的请求会话数据:
def my_view(request):
if request.user.is_authenticated():
print request.session.session_key
# the above prints something like this: "1ay2kcv7axb3nu5fwnwoyf85wkwsttz9"
print request.session.cache_key
# the above prints something like this: "django.contrib.sessions.cache1ay2kcv7axb3nu5fwnwoyf85wkwsttz9"
return HttpResponse(status=200)
else:
return HttpResponse(status=401)
我注意到在打印cache_key时,它使用默认的KEY_PREFIX进行打印,而对于session_key,它没有打印。看看代码中的注释,看看我的意思。
所以我想,"好的,其中一个关键名称应该有效。让我尝试手动抓取会话数据仅用于教育目的":
import pylibmc
mc = pylibmc.Client(['127.0.0.1:11211'])
# Let's try key "1ay2kcv7axb3nu5fwnwoyf85wkwsttz9"
mc.get("1ay2kcv7axb3nu5fwnwoyf85wkwsttz9")
没有任何反应,该名称没有密钥存在。好吧,不用担心,让我们尝试一下cache_key,那肯定能正常工作吗?
mc.get("django.contrib.sessions.cache1ay2kcv7axb3nu5fwnwoyf85wkwsttz9")
什么?我怎么还得不回来?当我测试时,我决定设置并获取一个随机键值,看它是否有效。我再次运行get_stats()以确保密钥确实存在。我还测试了网络应用程序,看看我的会话是否确实正常运行。因此,这使我得出结论,我不知道有不同的命名方案。
如果是,那么正确的命名方案是什么?
答案 0 :(得分:4)
是的,Django内部使用的缓存密钥通常与发送到缓存后端的密钥不同(在本例中为pylibmc / memcached)。我们分别将这两个密钥称为django缓存密钥和最终缓存密钥。
request.session.cache_key
提供的 django缓存密钥用于Django的低级缓存API,例如:
>>> from django.core.cache import cache
>>> cache.get(request.session.cache_key)
{'_auth_user_hash': '1ay2kcv7axb3nu5fwnwoyf85wkwsttz9', '_auth_user_id': u'1', '_auth_user_backend': u'django.contrib.auth.backends.ModelBackend'}
另一方面,最终缓存密钥是key prefix,django缓存密钥和缓存version number的组合。下面的make_key
函数(来自Django docs)演示了如何组合这三个值来生成此密钥:
def make_key(key, key_prefix, version):
return ':'.join([key_prefix, str(version), key])
默认情况下,key_prefix
为空字符串,version
为1。
最后,通过检查make_key
,我们发现传递给mc.get
的正确最终缓存键是
:1:django.contrib.sessions.cache1ay2kcv7axb3nu5fwnwoyf85wkwsttz9
,其格式为<KEY_PREFIX>:<VERSION>:<KEY>
。
注意:可以通过在缓存设置中定义KEY_FUNCTION
来更改最终缓存密钥。