При входе в систему 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):
# Backup first
session_backup = {}
for var in self.vars:
try:
session_backup[var] = request.session[var]
except KeyError:
pass
# Call the original view
response = view_func(request, *args, **kwargs)
# Restore variables in the new session
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)
А для представлений на основе классов (Джанго-Аллах):
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 = [
# Views that overlap the default:
url(r'^login/$', views.LoginView.as_view(), name='account_login'),
# default allauth urls
url(r'', include(allauth.urls)),
]