2015-02-19 3 views
8

Я работаю в проекте, который опирается в Django модели пользователя и TokenAuthentication под DjangoRestFrameworklast_login поля не обновляются при проверке подлинности с помощью Tokenauthentication в Django Framework Rest

Я просил, чтобы получить последний логин DateTime для каждого пользователя и Я понял, что это поле не обновляется, когда я вызываю конечную точку REST аутентификации.

Это известный факт? Я пропустил что-то, что я должен сделать, чтобы обновлять это поле каждый раз, когда вызывается токен-аутентификация?

Благодаря

+0

У меня такая же проблема с отдыхом. Последний вход, кажется, пропущен при работе с токенами – timop

+0

В конце я решил, что обновляю это поле самостоятельно. Я проверил исходный код и не обновлялся при входе в систему. –

+0

Привет, @ F.D.FDev вы можете поделиться своим решением по этой проблеме? – neptune

ответ

7

Ну, в конце концов, я унаследовал от REST Framework TokenAuthentication, указывая на него в URL-файл

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 Ответ велик. Вот еще один способ сделать это.

Мы посылаем user_logged_in сигналы, которые будут вызываться update_last_login:

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

Вот рабочий вид (на основе пользовательской модели пользователя, который использует электронную почту в качестве 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() 

Вы можете найти полный исходный код здесь: Api View with last_login updated

Надеюсь, что это h ELPS.

+0

это как-то * чувствует * как лучший способ сделать это - есть ли какие-либо конкретные преимущества/недостатки, о которых вы знаете? – simon

Смежные вопросы