Django检查会话而不在数据库中创建它

时间:2014-05-19 21:46:56

标签: python django session

我通常会像这样检查会话:

if request.session.get('var', False):  
  ...

唯一的问题是,如果我这样做并且会话不存在,django会创建它 - 在django_session表中添加一行。
如果不存在会话,如何在不创建会话的情况下执行此检查?

1 个答案:

答案 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在内部所做的事情,而不是在它不存在时创建一个新的会话对象。