[Django] Session. Control and testing
Before use request.session.session_key
in view, check that it exists first:
if request.session.session_key is None: request.session.save()
Session saves by middleware, if session.modified == True
, before response will be sent. If settings.SESSION_SAVE_EVERY_REQUEST == True
, session will be saved to the database on every request, and session.modified
doesn't matter.
If we need to control session manually, we can do like this:
def my_view(request): # do something, change session 1 request.session.save() # do something, change session 2 request.session.modified = False return response # the first changes will be saved and the second - no
As for testing, TestCase.client
doesn't has session, but we can add it:
from django.conf import settings from django.test import TestCase from django.utils.importlib import import_module class WithSessionTestCase(TestCase): def create_session(self): # initialize session settings.SESSION_ENGINE = 'django.contrib.sessions.backends.file' engine = import_module(settings.SESSION_ENGINE) store = engine.SessionStore() store.save() self.session = store self.client.cookies[settings.SESSION_COOKIE_NAME] = store.session_key def test_something(self): self.create_session() # now self.client.session is available
Links:
Licensed under CC BY-SA 3.0