有时request.session.session_key为None

时间:2016-08-27 13:27:04

标签: python django session django-sessions

我从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}) 获取session_key时遇到了问题。

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

以下是我的登录视图的片段:

session_id

现在,当调用此函数时,我看到响应中有时Nonereturn JsonResponse(...)

因此,在调试之后(我在request.session._session_key行设置了断点),我看到当我点到断点时Nonerequest.session.session_key,但u'j4lhxe8lvk7j4v5cmkfzytyn5235chf1'为{ {1}}和session_id也是None

有谁知道这怎么会发生?在返回回复之前,为什么session_key在将session_id分配给{{1}}时设置了值?

3 个答案:

答案 0 :(得分:18)

根据约翰的建议。

我通过以下代码修复了问题:

if not request.session.session_key:
    request.session.save()
session_id = request.session.session_key

答案 1 :(得分:5)

根据documentation

  

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

意味着使用create()而不是save()更安全。所以你可以这样尝试:

if not request.session.session_key:
    request.session.create()
session_id = request.session.session_key

答案 2 :(得分:0)

如果request.session.session_key为None,则表示会话对象是全新的,尚未保存到数据库中。调用request.session.save()应该填充该属性。 - 约翰戈登2016年8月27日15:36