有时 request.session.session_key 是 None

Posted

技术标签:

【中文标题】有时 request.session.session_key 是 None【英文标题】:Sometimes request.session.session_key is None 【发布时间】:2017-01-04 00:47:28 【问题描述】:

request.session 获取 session_key 时遇到问题。

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

这是我的登录视图的 sn-p:

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_idNone

所以,在调试之后(我在return JsonResponse(...) 行设置断点),我看到当我到达断点时request.session._session_keyNone,但request.session.session_keyu'j4lhxe8lvk7j4v5cmkfzytyn5235chf1' 并且session_id 也是None

有谁知道这是怎么回事?为什么在返回响应之前分配给session_id时没有设置session_key的值?

【问题讨论】:

如果request.session.session_key 为None,则表示会话对象是全新的,尚未保存到数据库中。调用 request.session.save() 应该填充该属性。 【参考方案1】:

根据约翰的建议。

我通过这个 sn-p 解决了这个问题:

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

【讨论】:

但是如果我刷新同一页面,它是如何保存的?? 好的。但是我会在我想使用session_key的代码中的任何地方检查这个?【参考方案2】:

根据documentation:

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

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

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

【讨论】:

这里的文档是错误的,如果您在会话是新的时查看代码(至少对于 db 后端),调用 save 调用 create,所以没有碰撞 id 的机会。所以最好直接调用 save 并避免“if”部分

以上是关于有时 request.session.session_key 是 None的主要内容,如果未能解决你的问题,请参考以下文章

pip:为啥有时安装为鸡蛋,有时安装为文件

mySql为啥查询时有时快,有时慢

MySQL 查询有时很快,有时很慢

为啥使用 == 比较两个整数有时有效,有时无效? [复制]

MySQL 有时不使用 INDEX 但有时会使用

漂亮的 URL 有时会用“?”重写。有时没有