Po krótkim debugowaniu udało mi się prześledzić przyczynę problemu. Jeden z moich middleware (i większość moich widoków) ma w nich request.user.is_authenticated()
.
django.contrib.auth
middleware ustawia request.user
do LazyUser()
Źródło: http://code.djangoproject.com/browser/django/trunk/django/contrib/auth/middleware.py?rev=14919#L13 (nie wiem dlaczego tam jest return None
tam, ale ok ...)
class AuthenticationMiddleware(object):
def process_request(self, request):
assert hasattr(request, 'session'), "The Django authentication middleware requires session middleware to be installed. Edit your MIDDLEWARE_CLASSES setting to insert 'django.contrib.sessions.middleware.SessionMiddleware'."
request.__class__.user = LazyUser()
return None
W LazyUser
rozmowy get_user(request)
dostać użytkownika:
Źródło: http://code.djangoproject.com/browser/django/trunk/django/contrib/auth/middleware.py?rev=14919#L5
class LazyUser(object):
def __get__(self, request, obj_type=None):
if not hasattr(request, '_cached_user'):
from django.contrib.auth import get_user
request._cached_user = get_user(request)
return request._cached_user
Sposób get_user(request)
robi user_id = request.session[SESSION_KEY]
Źródło: http://code.djangoproject.com/browser/django/trunk/django/contrib/auth/init.py?rev=14919#L100
def get_user(request):
from django.contrib.auth.models import AnonymousUser
try:
user_id = request.session[SESSION_KEY]
backend_path = request.session[BACKEND_SESSION_KEY]
backend = load_backend(backend_path)
user = backend.get_user(user_id) or AnonymousUser()
except KeyError:
user = AnonymousUser()
return user
Po dostępu sesji ustawia accessed
true:
Źródło: http://code.djangoproject.com/browser/django/trunk/django/contrib/sessions/backends/base.py?rev=14919#L183
def _get_session(self, no_load=False):
"""
Lazily loads session from storage (unless "no_load" is True, when only
an empty dict is stored) and stores it in the current instance.
"""
self.accessed = True
try:
return self._session_cache
except AttributeError:
if self._session_key is None or no_load:
self._session_cache = {}
else:
self._session_cache = self.load()
return self._session_cache
A to powoduje, że sesja zainicjować. Błąd został spowodowany przez wadliwe backend sesji, który generuje również sesję, gdy accessed
jest ustawiona na true ...
Wiem, że ta odpowiedź została napisana dawno temu, ale widzę ten sam problem. Wydaje się, że wyjaśnienie ma sens, ale czy jest jakieś rozwiązanie? Dzięki! – alan
Dla mnie poprawka polegała na upewnieniu się, że sesje nie zostały wygenerowane, gdy nie są naprawdę używane. Jedno z moich middleware ustawia sesję na "access" we wszystkich przypadkach, powodując jej wygenerowanie na każdym odsłony strony dla każdego bota. – Wolph
Hmm ... to musi być inny problem niż mój. Próbowałem stworzyć zupełnie nową aplikację django 1.4, a django.contrib.auth.views.login wydaje się powodować zapisanie nowej sesji, jeśli użytkownik jest anonimowy i nie odwiedził wcześniej. Stworzyłem nowe pytanie: http://stackoverflow.com/questions/17098142/django-session-created-in-database-when-login-page-loaded. Byłoby wspaniale, gdybyś mógł rzucić okiem. dzięki! – alan