2014-04-23 2 views
13

Sono nuovo in Django e sono riuscito a creare una piccola API utilizzando DRF. Ho i miei angular.js end client per utente distacco dettagli auth e DRF restituisce un segno che assomiglia a questo:Get Authenticated from token in Django Rest Framework

{ 'token' : '9944b09199c62bcf9418ad846dd0e4bbdfc6ee4b' } 

Sulla base del tutorial, dovrei recuperare i dettagli da request.user Ma io non lo so dove farlo Lo trovo confuso poiché non dà un buon esempio. Qualcuno con un'idea su come aggirarlo? Il tuo contributo è molto apprezzato.

Di seguito è riportato il codice della mia visualizzazione e del serializzatore.

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

Date un'occhiata al [seme angolare/DRF] (https://github.com/zackargyle/angularjs-django-rest-framework-seed) - che include autenticazione. – haki

+0

Drf-seed non fornisce dettagli come il nome utente per l'utente autenticato, ma solo un token per recuperare più risorse. Si prega di dare un'occhiata. Voglio restituire i dettagli dell'utente con questo token. –

risposta

11

Tenendo presente che io sono anche una novità per angolare e DRF ...

Se si sta già ricevendo il token, poi sul lato angularjs, è necessario per includere il token nelle intestazioni delle richieste successive. Forse come questo codice abbreviato dalla richiesta di autenticazione:

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

Nella tua ViewSet si sarebbe probabilmente desidera

authentication_classes = (TokenAuthentication,) 

insieme con qualunque permission_classes sono rilevanti.

Se si include il token nella richiesta http angolare, allora credo che si può fare riferimento all'utente request.user, come forse

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

Oppure, qui è un altro uso (modello Utente 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

Ho cercato di guardarmi intorno e ho risolto che questa potrebbe essere l'opzione migliore. Per me funziona. Grazie. –

+0

Ho usato questo per risolvere un problema simile, ma raccomanderei di sovrascrivere get_serializer_class per selezionare il serializzatore appropriato, e invece di chiamare Rispondi direttamente da recuperare imposta il pk in questo modo: self.kwargs ["pk"] = request.user.pk pk = request.user.pk In questo modo si modifica il comportamento predefinito il meno possibile. – jmickela