From 354f5bf8dcf1033f9bf013fdbab333b4046babb0 Mon Sep 17 00:00:00 2001 From: Julio Biason Date: Fri, 17 Jun 2016 17:02:59 -0300 Subject: [PATCH] more django rest --- django-rest.html | 172 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 172 insertions(+) diff --git a/django-rest.html b/django-rest.html index 5a1fd87..e2e7520 100644 --- a/django-rest.html +++ b/django-rest.html @@ -227,7 +227,179 @@ + +
+ +
+ +
+

Routes

+

+router = DefaultRouter()
+router.register(r'base_resource', ModelViewSet)
+urlpatterns = router.urls
+						
+ +

Onde:

+ + +
+ +
+

Por que "Routes"?

+ +

Para não precisar criar dois GETS, um POST, um PUT, + um PATCH e um DELETE.

+
+ +
+

E o que diabos é um ViewSet?

+ +

ViewSet define as funções para cada um dos verbos dentro do resource:

+ + +
+ +
+

ModelViewSet

+ +

Um ModelViewSet aplica as funções acima sobre um Model.

+ +

+class ProductViewSet(viewsets.ModelViewSet):
+    queryset = Product.objects.all()
+    serializer_class = ProductSerializer
+						
+ +

Existe ainda ReadOnlyModelViewSet que só define as funções + list() e retrieve().

+
+ +
+

Pera, pera... Serializer?

+ +

Serializers definem campos de resultados e sua validação, + caso estejam sendo usados como entradas (assim como Forms + são usados para validar entradas de dados por forms).

+ +

+class UserSerializer(serializers.ModelSerializer):
+
+    class Meta:
+        model = Product
+        fields = ('name', 'price')
+						
+
+ +
+
+

Fluxo REST Framework

+ +
    +
  • Request de um browser chega no Django;
  • +
  • Consulta o urls.py base do projeto para encontrar o + que será executado;
  • +
  • Consulta o urls.py da app (no caso) para encontrar + a view que será executada;
  • +
  • Continua acessando o urls.py do app, mas + esse é complementado com Routers;
  • +
+
+ +
+

Fluxo REST Framework (contd.)

+ +
    +
  • Acerta o Serializer para validar a entrada (se houver);
  • +
  • Vai ou ViewModelSet para definr a execução;
  • +
  • Faz os requests necessários para o model;
  • +
  • Passa o resultado de novo pelo Serializer para converter para + o formato de saída;
  • +
  • Retorna o request.
  • +
+
+
+ +
+
+

PS: Outras coisas legais

+ +

Vem com um serializador JSON como padrão, mas existem outros:

+ +
    +
  • djangorestframework-yaml: Serializador/desserializador para YAML.
  • +
  • djangorestframework-xml: Serializador/desserializador para XML.
  • +
+
+ +
+

JSON

+ +

+{
+    "count": 1,
+    "next": null,
+    "previous": null,
+    "results": [
+        {
+            "url": "http://127.0.0.1:8000/users/1/",
+            "username": "jbiason",
+            "email": "",
+            "groups": []
+        }
+    ]
+						
+
+ +
+

YAML

+ +

+count: 1
+next: null
+previous: null
+results:
+- email: ''
+  groups: []
+  url: http://127.0.0.1:8000/users/1/
+  username: jbiason
+						
+
+ +
+

XML

+ +

+
+1http://127.0.0.1:8000/users/1/jbiason
+						
+
+ +
+

(Todos os casos, só foi alterado o header "Accept" no request; nenhuma + alteração de código -- com exceção do settings.py para ativar os + serializers.)

+
+