2015-02-19 18 views
8

Tôi đang làm việc trong một dự án mà dựa vào một mô hình tài Django và TokenAuthentication dưới DjangoRestFrameworklĩnh vực LAST_LOGIN không được cập nhật khi chứng thực sử dụng Tokenauthentication trong Django Nghỉ ngơi Khung

tôi đã được yêu cầu để có được cuối cùng datetime đăng nhập cho mỗi người dùng và Tôi đã nhận ra rằng trường này không được cập nhật khi tôi gọi điểm cuối REST xác thực.

Đây có phải là sự thật đã biết không? Tôi có thiếu cái gì tôi phải làm để có được lĩnh vực đó được cập nhật mỗi khi xác thực mã thông báo được gọi là?

Cảm ơn

+0

Tôi đang gặp vấn đề tương tự với phần còn lại. Lần đăng nhập cuối cùng dường như bị bỏ qua khi giao dịch với mã thông báo – timop

+0

Cuối cùng, tôi đã tự giải quyết vấn đề này khi cập nhật trường đó. Tôi đã kiểm tra mã nguồn và nó không được cập nhật khi đăng nhập. –

+0

Xin chào, @ F.D.FDev bạn có thể chia sẻ giải pháp của mình cho vấn đề này không? – neptune

Trả lời

7

Vâng, vào cuối tôi thừa hưởng từ REST Khung TokenAuthentication, trỏ đến nó trong các url nộp

url(r'^api-token-auth/', back_views.TokenAuthenticationView.as_view()), 

và View xử lý các yêu cầu và tự gọi update_last_login như thế này:

from django.contrib.auth.models import update_last_login 

class TokenAuthenticationView(ObtainAuthToken): 
    """Implementation of ObtainAuthToken with last_login update""" 

    def post(self, request): 
     result = super(TokenAuthenticationView, self).post(request) 
     try: 
      request_user, data = requests.get_parameters(request) 
      user = requests.get_user_by_username(data['username']) 
      update_last_login(None, user)    
     except Exception as exc: 
      return None 
     return result 
3

@FDF câu trả lời là tuyệt vời. Đây là một cách khác để làm điều đó.

Chúng tôi gửi user_logged_in tín hiệu rằng sẽ gọi update_last_login:

user_logged_in.send(sender=user.__class__, request=request, user=user)

Dưới đây là một cái nhìn làm việc (dựa trên một mô hình tài khoản tùy chỉnh mà sử dụng email như USERNAME_FIELD):

from rest_framework import parsers, renderers 
from rest_framework.authtoken.models import Token 
from rest_framework.response import Response 
from rest_framework.views import APIView 

from django.contrib.auth.signals import user_logged_in 
from emailauth.serializers import AuthTokenSerializer, UserSerializer 


class ObtainAuthToken(APIView): 
    throttle_classes =() 
    permission_classes =() 
    parser_classes = (parsers.FormParser, parsers.MultiPartParser, parsers.JSONParser,) 
    renderer_classes = (renderers.JSONRenderer,) 
    serializer_class = AuthTokenSerializer 

    def post(self, request, *args, **kwargs): 
     serializer = self.serializer_class(data=request.data) 
     serializer.is_valid(raise_exception=True) 
     user = serializer.validated_data['user'] 
     token, created = Token.objects.get_or_create(user=user) 
     user_logged_in.send(sender=user.__class__, request=request, user=user) 
     return Response({'token': token.key, 'user': UserSerializer(user).data}) 


obtain_auth_token = ObtainAuthToken.as_view() 

Bạn có thể tìm mã nguồn đầy đủ tại đây: Api View with last_login updated

Hy vọng điều này h elps.

+0

bằng cách nào đó * cảm thấy * như một cách tốt hơn để làm việc đó - có bất kỳ ưu điểm/nhược điểm cụ thể nào mà bạn biết không? – simon

Các vấn đề liên quan