Sometimes request.session.session_key is None

给你一囗甜甜゛ 提交于 2019-12-07 01:16:58

问题


I hit a problem when get session_key from request.session.

I am using Django1.8 and Python2.7.10 to set up a RESTful service.

Here is snippet of my login view:

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})

Now when this function is called, I see sometimes session_id is None within the response.

So, after debugging (I set breakpoint at the return JsonResponse(...) line), I see that when I hit the breakpoint the request.session._session_key is None, but request.session.session_key is u'j4lhxe8lvk7j4v5cmkfzytyn5235chf1' and session_id is also None.

Does anyone know how can this happen? Why isn't the value of session_key set when assigning it to session_id before returning the response?


回答1:


According to John's suggestion.

I fixed the problem by this snippet:

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



回答2:


As per documentation:

SessionStore.create() is designed to create a new session (i.e. one not loaded from the session store and with session_key=None). save() is designed to save an existing session (i.e. one loaded from the session store). Calling save() on a new session may also work but has a small chance of generating a session_key that collides with an existing one. create() calls save() and loops until an unused session_key is generated.

Means it is safer to use create() instead of save(). So you can try like this:

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



回答3:


If request.session.session_key is None, that means the session object is brand-new and hasn't been saved to the db yet. Calling request.session.save() should populate that attribute. – John Gordon Aug 27 '16 at 15:36



来源:https://stackoverflow.com/questions/39181655/sometimes-request-session-session-key-is-none

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!