Иногда request.session.session_key имеет значение None

Я столкнулся с проблемой, когда получил session_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})

Теперь, когда эта функция вызывается, я иногда вижу session_id в ответе None.

Итак, после отладки (я установил точку останова на строке return JsonResponse(...)) я вижу, что когда я нажимаю точку останова, request.session._session_key равно None, но request.session.session_key равно u'j4lhxe8lvk7j4v5cmkfzytyn5235chf1', а session_id также равно None.

Кто-нибудь знает, как это может произойти? Почему значение session_key не устанавливается при назначении его session_id перед возвратом ответа?


person Wesley    schedule 27.08.2016    source источник
comment
Если request.session.session_key равно None, это означает, что объект сеанса является совершенно новым и еще не был сохранен в базе данных. Вызов request.session.save() должен заполнить этот атрибут.   -  person John Gordon    schedule 27.08.2016


Ответы (3)


По предложению Джона.

Я исправил проблему с помощью этого фрагмента:

if not request.session.session_key:
    request.session.save()
session_id = request.session.session_key
person Wesley    schedule 28.08.2016
comment
но как это сохранилось, если я обновлю ту же страницу ?? - person Kanishk Tanwar; 06.09.2018
comment
ХОРОШО. Но я буду проверять это везде в своем коде, который я хочу использовать session_key? - person Alper; 30.08.2020

Согласно документации:

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
person ruddra    schedule 02.12.2018
comment
Документы здесь неверны, если вы посмотрите на код (по крайней мере, для бэкэнда БД), когда сеанс новый, вызывая вызовы сохранения, создайте, поэтому нет никаких шансов столкнуться с идентификаторами. Так что лучше напрямую вызывать save и избегать части if - person ladorm; 24.10.2019

Если request.session.session_key имеет значение None, это означает, что объект сеанса является совершенно новым и еще не был сохранен в базе данных. Вызов request.session.save() должен заполнить этот атрибут. — Джон Гордон

person Muhammad HUssnain    schedule 18.04.2018