2015-08-02 14 views
5

Tôi đang gặp phải sự cố với Xác thực/Chế độ xem đăng nhập của mình. Hệ thống này đã hoạt động trước nhưng gần đây tôi đã chuyển sang một máy chủ mới và không thể sửa nó.Khung Django Rest - Request.user luôn là AnonymousUser và request.POST rỗng

Khi cố gắng đăng nhập qua chế độ xem xác thực, request.user luôn là một Người dùng ẩn danh như thể tôi không nạp bất kỳ thông tin đăng nhập xác thực nào. Tôi đã thử đăng nhập request.POST nhưng nó có vẻ là một dict trống.

Tôi có một traceback đây:

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' 

Ở đây tôi có quan điểm auth API được không:

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

bên dưới là lớp xác thực mà tôi đang sử dụng:

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

Nó không rõ ràng với tôi những gì bạn đang cố gắng làm. Thông thường, bạn sẽ sử dụng thông tin trong yêu cầu tìm nạp một người dùng, sau đó gọi 'login (request, user)' để đăng nhập chúng. Gọi 'login (request, request.user)' không có ý nghĩa - nếu 'request. user' không phải là vô danh, sẽ không cần phải đăng nhập chúng. – Alasdair

+0

@Alasdair có vẻ như tôi không thể truy cập thông tin đăng nhập được gửi trong yêu cầu Ajax. như tôi đã nói request.POST dường như trống rỗng, request.user không chứa chúng, hoặc cũng không request.username hoặc request.password ví dụ đó là các khóa tôi đã gửi trong yêu cầu. –

+0

Nội dung của 'request.body' là gì? – Alasdair

Trả lời

1

Nếu bạn đang sử dụng các lớp xác thực của khung công tác Django REST, bạn không cần phải đăng nhập vào người dùng. Người dùng sẽ được xác thực bởi khung công tác REST Django trước thời hạn và thông tin đăng nhập sẽ được xác thực trong quy trình.

Ngay bây giờ bằng cách gọi login bạn đang cố đăng nhập người dùng hiện tại (request.user) và liên kết với yêu cầu hiện tại (request). DRF sẽ tự động thực hiện việc này cho bạn và request.user sẽ chứa một phiên bản User nếu nó có thể xác thực người dùng và AnonymousUser (những gì bạn đang thấy) nếu nó không thể.

Nếu bạn đang cố đăng nhập người dùng cho yêu cầu Django (không phải yêu cầu DRF, which is different), bạn cần tham chiếu yêu cầu Django được lưu trữ là request._request.

login(request._request, request.user) 
Các vấn đề liên quan