2015-08-02 17 views
5

Sono di fronte a un problema con la mia vista di autenticazione/login. Questo sistema funzionava prima, ma di recente sono passato a un nuovo server e non riesco a farlo riparare.Django Rest Framework - Request.user è sempre AnonymousUser e request.POST è vuoto

Quando si tenta di accedere tramite la visualizzazione auth, request.user è sempre un AnonymousUser come se non avessi fornito le credenziali di autenticazione. Ho provato a registrare la request.POST ma sembra essere un ditt vuoto.

Ho un traceback qui:

Environment: 


Request Method: POST 
Request URL: http://45.55.149.3:8000/api/auth/ 

Django Version: 1.8.3 
Python Version: 2.7.6 
Installed Applications: 
('django.contrib.admin', 
'django.contrib.auth', 
'django.contrib.contenttypes', 
'django.contrib.sessions', 
'django.contrib.messages', 
'django.contrib.staticfiles', 
'webapp', 
'rest_framework', 
'djrill') 
Installed Middleware: 
('django.contrib.sessions.middleware.SessionMiddleware', 
'django.middleware.common.CommonMiddleware', 
'django.middleware.csrf.CsrfViewMiddleware', 
'django.contrib.auth.middleware.AuthenticationMiddleware', 
'django.contrib.auth.middleware.SessionAuthenticationMiddleware', 
'django.contrib.messages.middleware.MessageMiddleware', 
'django.middleware.clickjacking.XFrameOptionsMiddleware', 
'django.middleware.security.SecurityMiddleware') 


Traceback: 
File "/home/appointments-app/venv/local/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response 
    132.      response = wrapped_callback(request, *callback_args, **callback_kwargs) 
File "/home/appointments-app/venv/local/lib/python2.7/site-packages/django/views/decorators/csrf.py" in wrapped_view 
    58.   return view_func(*args, **kwargs) 
File "/home/appointments-app/venv/local/lib/python2.7/site-packages/django/views/generic/base.py" in view 
    71.    return self.dispatch(request, *args, **kwargs) 
File "/home/appointments-app/venv/local/lib/python2.7/site-packages/rest_framework/views.py" in dispatch 
    456.    response = self.handle_exception(exc) 
File "/home/appointments-app/venv/local/lib/python2.7/site-packages/rest_framework/views.py" in dispatch 
    453.    response = handler(request, *args, **kwargs) 
File "/home/appointments-app/appointments/webapp/views.py" in post 
    40.   login(request, request.user) 
File "/home/appointments-app/venv/local/lib/python2.7/site-packages/django/contrib/auth/__init__.py" in login 
    111.  request.session[SESSION_KEY] = user._meta.pk.value_to_string(user) 

Exception Type: AttributeError at /api/auth/ 
Exception Value: 'AnonymousUser' object has no attribute '_meta' 

Qui ho l'API vista di autenticazione, che sta fallendo:

class AuthView(APIView): 
    authentication_classes = (QuietBasicAuthentication,) 

    def post(self, request, *args, **kwargs): 
     login(request, request.user) 
     return Response(OldUserSerializer(request.user).data) 

    def delete(self, request, *args, **kwargs): 
     logout(request) 
     return Response({}) 

sotto è la classe di autenticazione che sto usando:

from rest_framework.authentication import BasicAuthentication 

class QuietBasicAuthentication(BasicAuthentication): 
    # disclaimer: once the user is logged in, this should NOT be used as a 
    # substitute for SessionAuthentication, which uses the django session cookie, 
    # rather it can check credentials before a session cookie has been granted. 
    def authenticate_header(self, request): 
     return 'xBasic realm="%s"' % self.www_authenticate_realm 
+1

Non mi è chiaro cosa stai cercando di fare. Di solito, dovresti usare le informazioni nella richiesta per recuperare un utente, quindi chiamare 'login (richiesta, utente)' per registrarle. Chiamare 'login (richiesta, request.user)' non ha senso - se 'richiesta. utente 'non era anonimo, non ci sarebbe bisogno di registrarli. – Alasdair

+0

@Alasdair sembra che non possa accedere alle credenziali inviate nella richiesta Ajax. come ho detto request.POST sembra essere vuoto, request.user non li contiene, né request.username o request.password per esempio quali sono le chiavi inviate nella richiesta. –

+0

Quali sono i contenuti di 'request.body'? – Alasdair

risposta

1

Se si utilizzano le classi di autenticazione del framework Django REST, non è necessario accedere all'utente. L'utente verrà autenticato dal framework Django REST in anticipo e le credenziali verranno convalidate nel processo.

In questo momento, chiamando login si sta tentando di accedere all'utente corrente (request.user) e associarli alla richiesta corrente (request). DRF lo farà automaticamente per te, e request.user conterrà un'istanza User se fosse in grado di autenticare l'utente e un AnonymousUser (quello che stai vedendo) se non è in grado di farlo.

Se si sta tentando di accedere all'utente per la richiesta Django (non la richiesta DRF, which is different) è necessario fare riferimento alla richiesta Django memorizzata come request._request.

login(request._request, request.user)