2017-07-08 74 views
1

我最近从支持数据库的会话迁移到使用pylibmc通过memcached存储的会话。通过Memcache的Django会话:手动找不到会话密钥

这里是我的缓存,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可以没有。看看代码中的评论,看看我的意思。

所以我想,“好,很好,这些关键的人物之一应该工作让我尝试手动抓住会话数据只为教育目的。”:

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()以确保密钥确实存在。我也测试了网络应用程序,看看我的会话是否确实正常工作。所以这导致我得出结论:我不知道有一个不同的命名方案。

如果是这样,那么正确的命名方案是什么?

回答

3

是的,Django内部使用的缓存键通常与发送到缓存后端的键不同(在本例中为pylibmc/memcached)。让我们分别称这两个键为django缓存键和最终缓存键。

django的高速缓存由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的组合物,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来更改最终缓存密钥。