2014-04-23 7 views
13

Ich bin neu in Django und ich habe es geschafft, eine kleine API mit DRF zu bauen. Ich habe meine Angularjs Client Ende Posting Benutzer Auth Details und DRF gibt ein Token, das wie folgt aussieht:Get Authenticated Benutzer von Token in Django Rest Framework

{ 'token' : '9944b09199c62bcf9418ad846dd0e4bbdfc6ee4b' } 

Basierend auf dem tutorial, soll ich die Details von request.user abzurufen Aber ich weiß nicht, Wo soll ich das machen? Ich finde es verwirrend, da es kein gutes Beispiel gibt. Jeder mit einer Idee, wie es umgeht? Ihre Eingabe wird sehr geschätzt.

Unten ist der Code meiner Ansicht und Serializer.

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 
+0

Werfen sie einen Blick auf die [Winkel/DRF Samen] (https://github.com/zackargyle/angularjs-django-rest-framework-seed) - es enthält Authentifizierung. – haki

+0

Drf-Seed bietet keine Details wie Benutzername für den authentifizierten Benutzer, sondern nur Token, um mehr Ressourcen abzurufen. Bitte werfen Sie einen Blick darauf. Ich möchte Benutzerdetails mit diesem Token zurückgeben. –

Antwort

11

Unter Berücksichtigung der Tatsache, dass ich auch bin neu in Winkel- und DRF ...

Wenn Sie bereits das Token empfängt, dann auf der AngularJS Seite, die Sie benötigen das Token in die Header Ihrer nachfolgenden Anfragen aufzunehmen. Vielleicht wie dieser abgekürzten Code aus der Authentifizierungs-Anfrage:

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

In Ihrem Viewset würden Sie wahrscheinlich wollen

authentication_classes = (TokenAuthentication,) 

zusammen mit dem, was permission_classes relevant sind.

Wenn Sie das Token in der Angular HTTP-Anforderung sind inklusive, dann glaube ich, Sie den Benutzer mit request.user verweisen können, wie vielleicht

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

Oder hier ist eine andere Verwendung (User-Modell ist 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) 
+0

Ich habe versucht, mich umzusehen, und ich habe festgestellt, dass dies die beste Option sein könnte. Für mich geht das. Vielen Dank. –

+0

Ich habe dies verwendet, um ein ähnliches Problem zu beheben, würde aber empfehlen, get_serializer_class zu überschreiben, um den richtigen Serializer zu wählen, und anstelle des Aufrufs Respond direkt von request den PC wie folgt setzen: self.kwargs ["pk"] = request.user.pk pk = request.user.pk Auf diese Weise ändern Sie das Standardverhalten so wenig wie möglich. – jmickela

Verwandte Themen