diff --git a/django-rest.html b/django-rest.html index e2e7520..4ea5329 100644 --- a/django-rest.html +++ b/django-rest.html @@ -48,9 +48,9 @@

Entendendo Django REST Framework

-
-
-

Review Django

+
+
+

Review Django

  • Request de um browser chega no Django;
  • @@ -62,50 +62,50 @@
  • Renderiza o template;
  • Retorna o template renderizado para o usuário.
-
-
+
+
-
-
-

Interlúdio: REST

+
+
+

Interlúdio: REST

-
+
-
-

REST: Recursos

+
+

REST: Recursos

-

Elementos são chamados "recursos" e fazem parte da URL.

+

Elementos são chamados "recursos" e fazem parte da URL.

-
    -
  • Recurso usuários: /user;
  • -
  • Recurso orders: /order;
  • -
  • Recurso produtos: /product
  • -
-
+
    +
  • Recurso usuários: /user;
  • +
  • Recurso orders: /order;
  • +
  • Recurso produtos: /product
  • +
+
-
-

REST: Recursos

+
+

REST: Recursos

-

Recursos específicos são indicados também na URL depois - da URL base do recurso, apontados por sua chave principal.

+

Recursos específicos são indicados também na URL depois + da URL base do recurso, apontados por sua chave principal.

-
    -
  • Usuário 1: /user/1/
  • -
  • Produto ws-1243: /product/ws-1243/
  • -
-
+
    +
  • Usuário 1: /user/1/
  • +
  • Produto ws-1243: /product/ws-1243/
  • +
+
-
-

REST: Recursos

+
+

REST: Recursos

-

Recursos podem estar aninhados.

+

Recursos podem estar aninhados.

-
    -
  • /user/1/order: Todos os pedidos do usuário 1.
  • +
      +
    • /user/1/order: Todos os pedidos do usuário 1.
    • /user/1/order/2: Pedido 2 do usuário 1.
    • -
    -
+ +

REST: Verbos/Ações

@@ -219,7 +219,7 @@
  • DELETE /user/1/order/2: Apaga o pedido 2 do usuário 1.
  • -
    +
    @@ -228,133 +228,138 @@
    -
    - +
    + +
    +

    Routes

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

    Onde:

    +

    Onde:

    - -
    + +
    -
    -

    Por que "Routes"?

    +
    +

    Por que "Routes"?

    -

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

    -
    +

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

    +
    -
    -

    E o que diabos é um ViewSet?

    +
    +

    E o que diabos é um ViewSet?

    -

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

    +

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

    - -
    + +
    -
    -

    ModelViewSet

    +
    +

    ModelViewSet

    -

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

    +

    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().

    -
    +

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

    +
    -
    -

    Pera, pera... Serializer?

    +
    +

    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).

    +

    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

    - - -
    - -
    -

    Fluxo REST Framework (contd.)

    - - -
    -
    - -
    -
    -

    PS: Outras coisas legais

    - -

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

    - - -
    - -
    -

    JSON

    - -
    
    +                
    +
    +

    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

    + +
    
    +curl -H 'Accept: application/json; indent=4' \
    +    -u  admin:admin123 http://127.0.0.1:8000/users/
    +                        
    + +
    
     {
         "count": 1,
         "next": null,
    @@ -362,18 +367,23 @@ class UserSerializer(serializers.ModelSerializer):
         "results": [
             {
                 "url": "http://127.0.0.1:8000/users/1/",
    -            "username": "jbiason",
    +            "username": "admin",
                 "email": "",
                 "groups": []
             }
         ]
    -						
    -
    +
    +
    -
    -

    YAML

    +
    +

    YAML

    -
    
    +                        
    
    +curl -H 'Accept: application/yaml' \
    +    -u  admin:admin123 http://127.0.0.1:8000/users/
    +                        
    + +
    
     count: 1
     next: null
     previous: null
    @@ -381,25 +391,42 @@ results:
     - email: ''
       groups: []
       url: http://127.0.0.1:8000/users/1/
    -  username: jbiason
    -						
    -
    + username: admin + +
    -
    -

    XML

    +
    +

    XML

    -
    
    +                        
    
    +curl -H 'Accept: application/xml' \
    +    -u  jbiason:slowdown http://127.0.0.1:8000/users/
    +                        
    + +
    
     
    -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.)

    -
    -
    + + 1 + + + + + http://127.0.0.1:8000/users/1/ + admin + + + + + + +
    + +
    +

    (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.)

    +
    +