2012-10-25 50 views
0

最近我們從django的默認DB會話切換到memcached會話。Django的會話模型可用於memcached會話嗎?

我們已經使用了contrib會話模型去除根據session_key可以會話:https://github.com/django/django/blob/master/django/contrib/sessions/models.py

Session.objects.get(session_key=key).delete() 

一旦我們切換到memcached的會議上面的查詢提出了DoesNotExist例外。

Django的會話模型是否可用於memcached會話?如果是這樣,解決方案是什麼?

回答

3

Django提供了一個django.contrib.sessions.backends.cache會話後端,只要高速緩存配置正確,該後端應該實現您所需要的。

如您自己所建議的,Session模型由db後端使用。要使用cache後端,您可以執行以下操作(以便繼續使用API​​並使代碼具有前瞻性)。

from django.contrib.sessions.backends.cache import SessionStore 
session = SessionStore(session_key) 
session.delete() 

這就是Sessions middleware中的做法。
此方法應該適用於任何後端,如果您決定在未來轉移到另一個後端,這可能是首選的行爲。

+0

我們正在使用sessions.backends.cache。看來Session模型僅適用於DB會話。 –

+0

@BrianCray從[contrib.sessions'的源代碼](https://github.com/django/django/blob/master/django/contrib/sessions/backends/cache.py),這聽起來很正確。你可能想看看'SessionStore.delete'方法! –

+0

@BrianCray我更新了我的答案以反映您的建議,並提供了一個只使用'sessions'模塊提供的API的答案。 –

1
mc = memcache.Client(settings.CACHE_BACKEND[:-1].split('//')[1].split(';')) 
mc.delete(str(key)) 
+0

這就是解決它的方法。 contrib會話模型似乎不適用於緩存會話,只有db會話。 –

+0

然後,您可能希望將其標記爲您接受的答案。 – BenjaminRH

+0

我無法將其標記爲接受爲期兩天:\ –