我通常会像这样检查会话:
if request.session.get('var', False):
...
唯一的问题是,如果我这样做并且会话不存在,django会创建它 - 在django_session表中添加一行。
如果不存在会话,如何在不创建会话的情况下执行此检查?
答案 0 :(得分:1)
默认情况下,会话后端以get-or-create方式处理会话。鉴于您正在使用数据库后端,您可以将访问包装在atomic
语句中,以便在未找到数据时自动回滚:
try:
with transaction.atomic():
var = request.session['var']
except KeyError:
var = False
修改强>:
如果你无法解决这个问题(虽然我很好奇为什么这样做不起作用),你可以尝试以下方法来访问会话数据而不会触发_get_session
方法:
try:
var = request.session._session_cache['var']
except AttributeError:
try:
s = Session.objects.get(
session_key=self.session_key,
expire_date__gt=timezone.now()
)
request.session._session_cache = self.decode(s.session_data)
var = request.session._session_cache['var']
except (Session.DoesNotExist, SuspicousOperation, KeyError):
var = False
except KeyError
var = False
Django SessionStore
对象(可通过request.session访问)实现字典界面并使用内部缓存。所有正常的字典访问都使用_session
属性,该属性尝试访问内部缓存,如果失败,则创建新的会话对象并将其存储在数据库中。通过直接访问内部缓存(session._session_cache
),您可以跳过该属性,如果失败,则会话后端不会自动创建新会话。这就是Django在内部所做的事情,而不是在它不存在时创建一个新的会话对象。