2016-02-27 23 views
5

stavo attraversando django rest framework tutorial sulla serializzazione in cui mi sono bloccato a JSONRenderers e JSONParsers Sotto è il codice di cui c'è:Differenza tra JSONParser e JSONRenderer

from snippets.models import Snippet 
from snippets.serializers import SnippetSerializer 
from rest_framework.renderers import JSONRenderer 
from rest_framework.parsers import JSONParser 
from django.utils.six import BytesIO 

snippet = Snippet(code='foo = "bar"\n') 
snippet.save() 

snippet = Snippet(code='print "hello, world"\n') 
snippet.save() 
serializer = SnippetSerializer(snippet) 
serializer.data 
# {'pk': 2, 'title': u'', 'code': u'print "hello, world"\n', 'linenos': False, 'language': u'python', 'style': u'friendly'} 
content = JSONRenderer().render(serializer.data) 
content 
# '{"pk": 2, "title": "", "code": "print \\"hello, world\\"\\n", "linenos": false, "language": "python", "style": "friendly"}' 

stream = BytesIO(content) 
data = JSONParser().parse(stream) 

So JSONParser è utilizzato per deserializzazione i dati e JSONRenderer sono usati per serializzarlo, ma non ho ancora una buona conoscenza della differenza tra serializzazione e deserializzazione di un dato. Qualcuno può fornirmi una chiara comprensione di questo (la risposta con un esempio è molto apprezzata)

E anche come funzionano JSONRenderer e JSONParser?

+2

serializzazione è la conversione di un oggetto in una stringa JSON (nel caso) e deserializzazione è il processo inverso. Cosa stai chiedendo esattamente? – Selcuk

+0

Sì, la stessa cosa, ma in un modo più elaborato ... Conosco la definizione di libro ma non ho una buona comprensione per lo stesso. –

risposta

5

Inizierò con le serie . La vista e i viewet sono classi in DRF, dove avviene la maggior parte della logica dell'applicazione.

Es. ModelViewSet è responsabile della classe per le operazioni CRUD in risposta ai metodi POST, PUT, PATCH, GET, DELETE HTTP.

Consente di dare un'occhiata al metodo di creazione predefinito da https://github.com/tomchristie/django-rest-framework/blob/master/rest_framework/mixins.py questo metodo crea l'istanza del modello, dai dati (se sono validi) invia tramite il metodo POST HTTP e li mantiene nel database.

def create(self, request, *args, **kwargs): 
     serializer = self.get_serializer(data=request.data) 
     serializer.is_valid(raise_exception=True) 
     self.perform_create(serializer) 
     headers = self.get_success_headers(serializer.data) 
     return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers) 

def perform_create(self, serializer): 
     serializer.save() 

Questo è che cosa sta accadendo qui.

self.get_serializer() creare una nuova istanza di serializzatore (si imposta prima la classe serializzatore), richiede request.data come argomento. request.data è (è importatore) dizionario . Il dizionario è struttura dati python generica.

serializer.is_valid() verifica dei metodi se request.data sono validi. Se sì, è possibile accedere a serializer.data - anche un dizionario.

serializer.save() metodo crea e mantiene l'istanza effettiva del modello (Snippet) nel database. È possibile accedere direttamente a esempio come questo

instance = serializer.save() 

Poi ritorni oggetto Response popolato con serializer.data nuovo al cliente.

Come si può vedere, c'è no Dati modulo, JSON, XML, HTML ecc. Nella serie di viste. Si lavora con i tipi di dati Python e il serializzatore è responsabile del dizionario "traslatorio" su istanza del modello specifico e all'indietro. Ma il client invia dati (nel tuo caso) nella richiesta HTTP in forma di JSON.

JSONParser è responsabile della conversione di JSON nel dizionario. L'analisi è implementata all'interno della classe di richiesta https://github.com/tomchristie/django-rest-framework/blob/master/rest_framework/request.py, si prega di notare che non è il modello HttpRequest standard di django.

È possibile impostare più parser, quindi la richiesta sceglierà quella corretta in base all'intestazione della richiesta HTTP: Tipo di contenuto.

La seconda cosa è, è necessario restituire serializer.data al client in forma di JSON, non dizionario. Ecco cosa fa JSONRenderer. Converte dict in JSON e viene implementato all'interno della classe di risposta https://github.com/tomchristie/django-rest-framework/blob/master/rest_framework/response.py. Inoltre è possibile impostare più renderer e quindi scegliere quello giusto in base all'intestazione http del tipo di media accettato.

Esempio di definizione completa viewset potrebbe essere:

from snippets.models import Snippet 
from snippets.serializers import SnippetSerializer 
from rest_framework.renderers import JSONRenderer 
from rest_framework.parsers import JSONParser 


class SnippetViewSet(viewsets.ModelViewSet): 

    queryset = Snippet.objects.all() 
    serializer_class = SnippetSerializer 
    renderer_classes = (JSONRenderer,) 
    parser_classes = (JSONParser,) 
+0

Immagino che questo sia ciò di cui ho bisogno ... Grazie ... –