Django session.flush() session.cycle_key(), , . , . , , , , .
- , , .
Chase Seibert , - . , :
class persist_session_vars(object):
"""
Some views, such as login and logout, will reset all session state.
(via a call to ``request.session.cycle_key()`` or ``session.flush()``).
That is a security measure to mitigate session fixation vulnerabilities.
By applying this decorator, some values are retained.
Be very aware what find of variables you want to persist.
"""
def __init__(self, vars):
self.vars = vars
def __call__(self, view_func):
@wraps(view_func)
def inner(request, *args, **kwargs):
session_backup = {}
for var in self.vars:
try:
session_backup[var] = request.session[var]
except KeyError:
pass
response = view_func(request, *args, **kwargs)
for var, value in session_backup.items():
request.session[var] = value
return response
return inner
:
from django.contrib.auth import views
@persist_session_vars(['some_field'])
def login(request, *args, **kwargs):
return views.login(request, *args, **kwargs)
(django-allauth):
import allauth.account.views as auth_views
from django.utils.decorators import method_decorator
@method_decorator(persist_session_vars(['some_field']), name='dispatch')
class LoginView(auth_views.LoginView):
pass
URL:
import allauth.urls
from django.conf.urls import include, url
from . import views
urlpatterns = [
url(r'^login/$', views.LoginView.as_view(), name='account_login'),
url(r'', include(allauth.urls)),
]