2015-08-02 26 views
5

Kimlik Doğrulama/Giriş Görünümüm ile ilgili bir sorunla karşı karşıyayım. Bu sistem daha önce çalışıyordu ama yakın zamanda yeni bir sunucuya geçtim ve düzeltilemedi.Django Rest Framework - Request.user her zaman AnonymousUser ve request.POST boş

Auth görünümü aracılığıyla oturum açmaya çalışırken request.user her zaman bir kimlik doğrulama bilgisinde beslemediğim gibi bir Anonim Kullanıcıdır. Request.POST giriş denedim ama boş bir dict gibi görünüyor.

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 
: Aşağıdaki
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({}) 

i kullanıyorum kimlik doğrulama sınıftır: Burada

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' 

i başarısız API kimlik doğrulama görünümü vardır:

Burada bir Traceback var

+1

Yapmaya çalıştığınız şey bana açık değil. Genellikle, bir kullanıcı almak için istekte bilgi kullanırsınız, daha sonra oturum açmak için "login (istek, kullanıcı)" olarak adlandırın. "Oturum açma (istek, request.user)" demek mantıklı değil - istek varsa. kullanıcı 'anonim değildi, onları oturum açmaya gerek kalmayacak. – Alasdair

+0

@Alasdair Ajax isteğinde sunulan kimlik bilgilerine erişemiyorum. İstek dediğim gibi.POST boş görünüyor, request.user onları kapsayıcı ya da request.username veya request.password gibi istekte gönderdiğim anahtarlardır. –

+0

'request.body' içeriği nedir? – Alasdair

cevap

1

Django REST framework'ün kimlik doğrulama sınıflarını kullanıyorsanız, kullanıcının giriş yapmasına gerek yoktur. Kullanıcı, Django REST çerçevesi tarafından önceden doğrulanacak ve kimlik bilgileri süreçte doğrulanacaktır.

Şu anda login numaralı telefonu arayarak geçerli kullanıcı (request.user) oturum açmaya çalışıyor ve bunları geçerli isteğiyle ilişkilendiriyorsunuz (request). DRF bunu sizin için otomatik olarak yapar ve , kullanıcının kimliğini doğrulayabiliyorsa ve AnonymousUser (ne görüyorsanız) yapamıyorsa User örneğini içerecektir.

Kullanıcıya Django isteği için giriş yapmaya çalışıyorsanız (DRF isteği, which is different), request._request olarak saklanan Django isteğine başvurmanız gerekir.

login(request._request, request.user) 
İlgili konular