Dopo un po 'di debug sono riuscito a rintracciare la causa del problema. Uno dei miei middleware (e la maggior parte delle mie opinioni) ha uno request.user.is_authenticated()
in loro.
Il django.contrib.auth
middleware imposta request.user
-LazyUser()
Fonte: http://code.djangoproject.com/browser/django/trunk/django/contrib/auth/middleware.py?rev=14919#L13 (non vedo il motivo per cui v'è una return None
lì, ma 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
I LazyUser
chiamate get_user(request)
per ottenere l'utente:
Fonte: 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
Il metodo get_user(request)
fa un user_id = request.session[SESSION_KEY]
Fonte: 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
Al momento l'accesso alla sessione imposta accessed
true:
Fonte: 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
E che causa la sessione per inizializzare. Il bug è stato causato da un backend di sessione difettoso che genera anche una sessione quando accessed
è impostato su true ...
So che questa risposta è stata scritta molto tempo fa, ma vedo lo stesso problema. La spiegazione sembra avere senso, ma c'è una soluzione? Grazie! – alan
Per me la soluzione era assicurarsi che le sessioni non venissero generate quando gli articoli non erano realmente usati. Uno dei miei middleware imposta la sessione su 'accessible' in tutti i casi provocandone la generazione su ogni visualizzazione di pagina per ogni bot. – Wolph
Hmm ... deve essere un problema diverso dal mio allora. Ho provato a creare una nuovissima app django 1.4 e django.contrib.auth.views.login sembra far sì che una nuova sessione venga salvata se l'utente è anonimo e non ha visitato in precedenza. Ho creato una nuova domanda per questo: http://stackoverflow.com/questions/17098142/django-session-created-in-database-when-login-page-loaded. Sarebbe bello se potessi dare un'occhiata. Grazie! – alan