web-dev-qa-db-ja.com

request.session.session_keyがNoneの場合があります

request.sessionからsession_keyを取得するときに問題が発生しました。

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

この関数が呼び出されると、応答内でsession_idNoneであることがあります。

したがって、デバッグ後(return JsonResponse(...)行にブレークポイントを設定)、ブレークポイントに到達するとrequest.session._session_keyNoneですが、request.session.session_keyu'j4lhxe8lvk7j4v5cmkfzytyn5235chf1'であり、session_idNone

誰かがこれがどのように起こることができるか知っていますか?応答を返す前にsession_keyに割り当てるときにsession_idの値が設定されないのはなぜですか?

7
Wesley

ジョンの提案によると。

私はこのスニペットで問題を修正しました:

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

ドキュメント

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
6
ruddra

Request.session.session_keyがNoneの場合、それはセッションオブジェクトが真新しく、まだデータベースに保存されていないことを意味します。 request.session.save()を呼び出すと、その属性にデータが入力されます。 –ジョンゴードン2016年8月27日15:36

0