2015-08-02 2 views
5

У меня возникла проблема с моей проверкой подлинности/входа в систему. Эта система работала до этого, но недавно я переключился на новый сервер и не могу исправить ее.Django Rest Framework - Request.user всегда AnonymousUser и request.POST пуст

При попытке войти в систему через auth view requester всегда является анонимным пользователем, как будто я не загружал никаких учетных данных. Я пробовал регистрировать запрос.POST, но, похоже, это пустой dict.

У меня есть отслеживающий здесь:

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' 

Здесь я иметь вид аутентификации API, который неисправный:

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({}) 

ниже класс аутентификации, который я использую:

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

Непонятно, что вы пытаетесь сделать. Как правило, вы должны использовать информацию в запросе для извлечения пользователя, а затем вызывать 'login (request, user)' для входа в систему. Вызов 'login (request, request.user)' не имеет смысла - если 'запрос. пользователь не был анонимным, не было необходимости их вносить в систему. – Alasdair

+0

@Alasdair кажется, что я не могу получить доступ к учетным данным, представленным в запросе Ajax. как я сказал request.POST кажется пустым, request.user также не является их контейнером, и не запрашивает имя request.username или request.password, которые являются ключами, представленными в запросе. –

+0

Что такое содержимое 'request.body'? – Alasdair

ответ

1

Если вы используете классы аутентификации Django REST, вам не нужно вводить пользователя в систему. До истечения времени пользователь будет аутентифицироваться инфраструктурой Django REST, и учетные данные будут проверены в процессе.

Сразу по телефону login вы пытаетесь ввести имя пользователя (request.user) и связать их с текущим запросом (request). DRF сделает это автоматически для вас, и request.user будет содержать экземпляр User, если он сможет аутентифицировать пользователя и AnonymousUser (что вы видите), если он не в состоянии.

Если вы пытаетесь зарегистрировать пользователя для запроса Django (а не запрос DRF, which is different), вам необходимо обратиться к запросу Django, который хранится как request._request.

login(request._request, request.user) 
Смежные вопросы