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 @@
Elementos são chamados "recursos" e fazem parte da URL.
+Elementos são chamados "recursos" e fazem parte da URL.
-/user
;/order
;/product
/user
;/order
;/product
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.
-/user/1/
/product/ws-1243/
/user/1/
/product/ws-1243/
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.DELETE /user/1/order/2
: Apaga o pedido 2 do usuário 1.
+ - 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.
+
router = DefaultRouter()
router.register(r'base_resource', ModelViewSet)
urlpatterns = router.urls
-
+
- Onde:
+Onde:
-base_resource
: é a URL base de acesso ao recurso;ModelViewSet
: é um ViewSet criado em cima do modelo.base_resource
: é a URL base de acesso ao recurso;ModelViewSet
: é um ViewSet criado em cima do modelo.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.
+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:
-list(self, request)
create(self, request)
retrieve(self, request, pk=None)
update(self, request, pk=None)
partial_update(self, request, pk=None)
destroy(self, request, pk=None)
list(self, request)
create(self, request)
retrieve(self, request, pk=None)
update(self, request, pk=None)
partial_update(self, request, pk=None)
destroy(self, request, pk=None)
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()
.
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')
-
-
Vem com um serializador JSON como padrão, mas existem outros:
- -djangorestframework-yaml
: Serializador/desserializador para YAML.djangorestframework-xml
: Serializador/desserializador para XML.
+
+
+ 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": []
}
]
-
-
+
+
+
+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
-
-
+
+curl -H 'Accept: application/xml' \
+ -u jbiason:slowdown http://127.0.0.1:8000/users/
+
+
+
-1 http://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.)
-(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.)
+