web-dev-qa-db-ja.com

Django Rest Frameworkのトークンから認証済みユーザーを取得する

私はDjangoの新人であり、DRFを使用して小さなAPIを構築することができました。angular.jsクライアントがユーザー認証の詳細をポストし、DRFが次のようなトークンを返します。

{ 'token' : '9944b09199c62bcf9418ad846dd0e4bbdfc6ee4b' }

tutorial に基づいて、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    

シリアライザ

 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
21
Cheruiyot Felix

AngularとDRF ...も初めてということを覚えておいてください。

すでにトークンを受け取っている場合は、angularjs側で、後続のリクエストのヘッダーにトークンを含める必要があります。おそらく、次のような認証リクエストからの省略コードです。

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

ビューセットでは、おそらく

authentication_classes = (TokenAuthentication,)

関連するどんなpermission_classesも一緒に。

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)
15
Liam

私の場合、API RESTクライアントでAPIをテストしようとしています。構成にヘッダーを配置すると機能します。

Authorization: Token <<token>>
0