Сеансовая переменная извлекается в локальную переменную при работе на локальной - PullRequest
0 голосов
/ 27 сентября 2011

Я заметил странное поведение при взаимодействии с переменными сеанса в Django. В одном из моих приложений я создал файл middleware.py, содержащий функцию, которая копирует переменную сеанса, которая сохраняет объект в локальную, а затем я изменяю атрибут объекта из локальной переменной. Бывает, что изменения, которые я делаю в локальной переменной, применяются и к переменной сеанса. Кажется, что локальная переменная является только ссылкой на сессию. Это поведение правильно? Вот код:

class CloudMiddleware(object):
    user = request.session['user']
    user.email = 'myemail'

Когда я делаю

user = request.session['user']
email = user.email

Значение электронной почты равно myemail. Я всегда думал, что должен сохранить свой объект обратно в сеансе, если я хочу сохранить его. Может ли кто-нибудь объяснить мне, как это действительно работает?

Ответы [ 2 ]

1 голос
/ 27 сентября 2011

Это не имеет ничего общего с сессиями, а является простым следствием того, как работают изменяемые объекты Python.Когда вы делаете user = request.session['user'], вы получаете ссылку на объект, точно так же, как с любым другим изменяемым объектом, хранящимся в стандартном словаре.Так что да, когда вы изменяете один из его атрибутов, на это изменение ссылаются в любой другой имеющейся на него ссылке.

Обратите внимание, что для сеансов это изменение будет сохраняться только в течение срока действия текущего запроса.Это потому, что Django не может знать, что объект сеанса изменился, поэтому не будет сохранять его, если вы не указали это специально - см. документацию для подробностей.

1 голос
/ 27 сентября 2011

user является изменяемым объектом, поэтому он передается по ссылке.Все правильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...