通过 Memcache 的 Django 会话:无法手动找到会话密钥
Django Sessions via Memcache: Cannot find session key manually
我最近使用 pylibmc 从数据库支持的会话迁移到通过 memcached 存储的会话。
这是我的缓存,SESSION_CACHE_ALIAS & SESSION_ENGINE 在我的 settings.py
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 则没有。看看代码中的注释就明白我的意思了。
所以我想,"Ok great, one of these key names should work. Let me try grabbing the session data manually just for educational purposes":
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() 只是为了确保密钥确实存在。我还测试了网络应用程序,看看我的会话是否确实在工作并且确实如此。所以这让我得出结论,我不知道有一个不同的命名方案。
如果是这样,正确的命名方案是什么?
是的,Django 内部使用的缓存键通常与发送到缓存后端(在本例中为 pylibmc / memcached)的键不同。让我们分别称这两个键为 django 缓存键和最终缓存键。
django cache key由request.session.cache_key
给出,用于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, the django cache key, and the cache version number. The make_key
function (from 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
来更改最终缓存键。
我最近使用 pylibmc 从数据库支持的会话迁移到通过 memcached 存储的会话。
这是我的缓存,SESSION_CACHE_ALIAS & SESSION_ENGINE 在我的 settings.py
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 则没有。看看代码中的注释就明白我的意思了。
所以我想,"Ok great, one of these key names should work. Let me try grabbing the session data manually just for educational purposes":
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() 只是为了确保密钥确实存在。我还测试了网络应用程序,看看我的会话是否确实在工作并且确实如此。所以这让我得出结论,我不知道有一个不同的命名方案。
如果是这样,正确的命名方案是什么?
是的,Django 内部使用的缓存键通常与发送到缓存后端(在本例中为 pylibmc / memcached)的键不同。让我们分别称这两个键为 django 缓存键和最终缓存键。
django cache key由request.session.cache_key
给出,用于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, the django cache key, and the cache version number. The make_key
function (from 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
来更改最终缓存键。