有时request.session.session_key为None

Wes*_*ley 7 python django session django-sessions

我从get_key中获取了一个问题request.session.

我正在使用Django1.8和Python2.7.10来设置RESTful服务.

这是我的登录视图的片段:

user = authenticate(username=userName, password=passWord)
if user is not None:
    # the password verified for the user
    if user.is_active:
        # app_logger.debug("User is valid, active and authenticated")
        if hasattr(user, 'parent') :
            login(request, user)
            request.session['ut'] = 4 
            # user type 1 means admin, 2 for teacher, 3 for student, 4 for parents
            request.session['uid'] = user.id
            description = request.POST.get('description','')

            request.session['realname'] = user.parent.realname
            request.session['pid'] = user.parent.id
            devicemanage.update_user_device(devicetoken, user.id, ostype, description) 
            children = parentmanage.get_children_info(user.parent.id)
            session_id = request.session.session_key
            user.parent.login_status = True
            user.parent.save()
            return JsonResponse({'retcode': 0,'notify_setting':{'receive_notify':user.parent.receive_notify,'notify_with_sound':user.parent.notify_with_sound,'notify_sound':user.parent.notify_sound,'notify_shake':user.parent.notify_shake},'pid':user.parent.id,'children':children,'name':user.parent.realname,'sessionid':session_id,'avatar':user.parent.avatar,'coins':user.parent.coins})
Run Code Online (Sandbox Code Playgroud)

现在,当调用此函数时,我看到有时session_idNone在响应中.

因此,调试(我在设置断点后return JsonResponse(...)线),我看到,当我遇到断点的request.session._session_key就是None,不过request.session.session_keyu'j4lhxe8lvk7j4v5cmkfzytyn5235chf1'session_idNone.

有谁知道这怎么可能发生?在返回响应之前,为什么不将session_keyset赋值给它session_id

Wes*_*ley 19

根据约翰的建议.

我通过这个片段修复了问题:

if not request.session.session_key:
    request.session.save()
session_id = request.session.session_key
Run Code Online (Sandbox Code Playgroud)


rud*_*dra 6

根据文档

SessionStore.create()用于创建一个新会话(即,未从会话存储中加载的会话,并且session_key = None)。save()用于保存现有会话(即从会话存储中加载的会话)。在新的会话上调用save()也可能有效,但是生成与现有会话冲突的session_key的机会很小。create()调用save()并循环直到生成未使用的session_key。

表示使用create()代替会更安全save()。所以你可以这样尝试:

if not request.session.session_key:
    request.session.create()
session_id = request.session.session_key
Run Code Online (Sandbox Code Playgroud)

  • 这里的文档是错误的,如果您在会话是新的时查看代码(至少对于数据库后端),调用保存调用创建,因此不会有冲突 id 的机会。所以最好直接调用 save 并避免“if”部分 (2认同)