Подтвердить что ты не робот

Получить аутентифицированного пользователя из токена в Django Rest Framework

Я новичок в Django, и мне удалось создать небольшой API с помощью DRF. У меня есть мой клиентский конец angular.js, который отправляет данные о пользователях пользователя, а DRF возвращает токен, который выглядит следующим образом:

{ 'token' : '9944b09199c62bcf9418ad846dd0e4bbdfc6ee4b' }

На основе учебника я должен получить информацию из request.user Но я не знаю, где это сделать. Я нахожу это запутанным, так как это не дает хорошего примера. Кто-нибудь с идеей о том, как обойти это? Ваш вход высоко оценен.

Ниже приведен код моего представления и сериализатора.

from serializers import ExampleSerializer
from models import Example
from rest_framework import viewsets

class ExampleViewSet(viewsets.ModelViewSet):
    """
    Example api description
    """
    queryset = Example.objects.all()
    serializer_class = ExampleSerializer    

Serializer

 from models import Example
 from rest_framework import serializers

 class ExampleSerializer(serializers.ModelSerializer):
      class Meta:
        model = Example
        fields = ('id', 'field_one', 'field_two', 'created_at', 'updated_at')
        depth = 1
4b9b3361

Ответ 1

Помня, что я также новичок в Angular и DRF...

Если вы уже получаете токен, то на стороне углового вам нужно включить токен в заголовки ваших последующих запросов. Возможно, как этот сокращенный код из запроса аутентификации:

$http({auth request code here}).then(function(response){
  var token = response.headers().token
  $http.defaults.headers.common['Authorization'] = 'Token ' + token;
});

В вашем ViewSet вы, скорее всего, захотите

authentication_classes = (TokenAuthentication,)

вместе с любыми релевантными полномочиями.

Если вы включаете токен в Angular http-запрос, то я считаю, что вы можете ссылаться на пользователя с request.user, например,

def list(self, request):
    queryset = SomeObject.objects.filter(owner=request.user)

Или, здесь другое использование (модель пользователя - django.contrib.auth.models.User):

class UserView(RetrieveAPIView):
    model = User
    serializer_class = UserSerializer

    def retrieve(self, request, pk=None):
        """
        If provided 'pk' is "me" then return the current user.
        """
        if request.user and pk == 'me':
            return Response(UserSerializer(request.user).data)
        return super(UserView, self).retrieve(request, pk)