2015-02-19 9 views
8

Django रेस्ट में Tokenauthentication का उपयोग कर के सत्यापन मैं एक परियोजना है जो DjangoRestFrameworkLAST_LOGIN क्षेत्र अपडेट नहीं किया जाता जब फ्रेमवर्क

के तहत एक Django उपयोगकर्ता मॉडल और TokenAuthentication में निर्भर करता है

मैं प्रत्येक उपयोगकर्ता के लिए अंतिम प्रवेश के datetime प्राप्त करने के लिए अनुरोध किया गया था और में काम कर रहा हूँ मुझे एहसास हुआ है कि जब मैं प्रमाणीकरण आरईएसटी एंडपॉइंट को कॉल करता हूं तो यह फ़ील्ड अपडेट नहीं हो रहा है।

क्या यह ज्ञात तथ्य है? क्या मुझे कुछ याद आ रहा है कि टोकन प्रमाणीकरण कहने पर हर बार उस फ़ील्ड को अपडेट करने के लिए मुझे क्या करना चाहिए?

धन्यवाद

+0

मुझे आराम के साथ एक ही समस्या है। टोकन – timop

+0

से निपटने के दौरान अंतिम लॉगिन छोड़ दिया जाता है अंत में मैंने इसे अपने आप से उस क्षेत्र को अद्यतन करने का हल किया। मैंने सोर्स कोड की जांच की और लॉग इन करते समय इसे अपडेट नहीं किया जा रहा था। –

+0

हाय, @ एफडीएफडीवी क्या आप इस मुद्दे के लिए अपना समाधान साझा कर सकते हैं? – neptune

उत्तर

7

खैर, अंत मैं बाकी फ्रेमवर्क TokenAuthentication से विरासत में मिली, यूआरएल में यह की ओर इशारा करते पर

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

फ़ाइल और अनुरोध देखें संभालती है और मैन्युअल रूप से इस तरह update_last_login कॉल:

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 जवाब बहुत अच्छा है। इसे करने का एक और तरीका यहां है।

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

आप कर सकते हैं:

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

यहाँ (USERNAME_FIELD रूप में ईमेल का उपयोग करता है एक कस्टम उपयोगकर्ता मॉडल के आधार पर) एक काम दृश्य है:

हम user_logged_in संकेत है कि update_last_login फोन करेगा भेज यहां पूर्ण स्रोत कोड खोजें: Api View with last_login updated

आशा है कि यह एच elps।

+0

कस्टमाइज़ कर सकें * ऐसा लगता है * ऐसा करने के बेहतर तरीके की तरह - लगता है क्या आपको कोई विशिष्ट फायदे/नुकसान हैं जिनके बारे में आप जानते हैं? – simon

संबंधित मुद्दे