Когда в клиенте не установлены файлы cookie, свойство session
является пустым словарем, следовательно, ваша ошибка. Вот соответствующий источник django.test.client.Client
:
def _session(self):
"""
Obtains the current session variables.
"""
if 'django.contrib.sessions' in settings.INSTALLED_APPS:
engine = import_module(settings.SESSION_ENGINE)
cookie = self.cookies.get(settings.SESSION_COOKIE_NAME, None)
if cookie:
return engine.SessionStore(cookie.value)
return {}
session = property(_session)
Поскольку вы не вошли в систему, файл cookie с ключом, соответствующим settings.SESSION_COOKIE_NAME
, не найден.
Однако вы можете вручную создать объект сеанса следующим образом:
if not self.client.session:
engine = import_module(settings.SESSION_ENGINE)
self.client.session = engine.SessionStore()
self.client.session.save()
Именно так обработчик login
в Client
создает новый сеанс.
EDIT: я понял, что вам также нужно сохранить ключ сеанса в файле cookie, чтобы следующий запрос использовал тот же сеанс
Вот вспомогательная функция, которую вы можете поместить в свой подкласс Client
, которая создает новый сеанс и ссылающийся файл cookie:
def set_session_data(self, key, value):
"""Shortcut for setting session data regardless of being authenticated"""
if not self.client.session:
# Save new session in database and add cookie referencing it
engine = import_module(settings.SESSION_ENGINE)
self.client.session = engine.SessionStore()
self.client.session.save()
session_cookie = settings.SESSION_COOKIE_NAME
self.client.cookies[session_cookie] = self.client.session.session_key
cookie_data = {
'max-age': None,
'path': '/',
'domain': settings.SESSION_COOKIE_DOMAIN,
'secure': settings.SESSION_COOKIE_SECURE or None,
'expires': None,
}
self.client.cookies[session_cookie].update(cookie_data)
self.client.session[key] = value
self.client.session.save()
Примечание: я не говорю, что это единственный способ сделать это, это один из способов, который я узнал, прочитав исходный код django. Код в этом ответе не тестировался/не запускался, поэтому может потребоваться его тонкая настройка.
дальнейшее чтение
Чтобы узнать, как работает SessionStore
, вы можете посмотреть модуль django.contrib.sessions
.
Чтобы прочитать о том, как сеанс и файлы cookie обрабатываются в Client
, вы можете посмотреть django.test.client.Client
.
person
rzetterberg
schedule
05.08.2014