48
DJANGO-REST-FRAMEWORK AWESOME WEB-BROWSABLE WEB APIS por e Filipe Ximenes Fernando Rocha

DJANGO-REST-FRAMEWORK: AWESOME WEB-BROWSABLE WEB APIS

Embed Size (px)

DESCRIPTION

Palestra ministrada por Filipe Ximenes e Fernando Rocha na PythonBrasil[9]

Citation preview

Page 1: DJANGO-REST-FRAMEWORK: AWESOME WEB-BROWSABLE WEB APIS

DJANGO-REST-FRAMEWORKAWESOME WEB-BROWSABLE WEB APIS

por e Filipe Ximenes Fernando Rocha

Page 2: DJANGO-REST-FRAMEWORK: AWESOME WEB-BROWSABLE WEB APIS

Developer @ thinkrApaixonado por Python

Entusiasta de Software LivreInteressado em web e infraestrutura.

Page 3: DJANGO-REST-FRAMEWORK: AWESOME WEB-BROWSABLE WEB APIS

THINKR

Page 4: DJANGO-REST-FRAMEWORK: AWESOME WEB-BROWSABLE WEB APIS

Fundador da VintaDesenvolvedor Web

Apaixonado por aprenderFã de comunidades de Sofware Livre

Curioso de empreendedorismo

Page 5: DJANGO-REST-FRAMEWORK: AWESOME WEB-BROWSABLE WEB APIS

DJANGO-REST-FRAMEWORK

AWESOME WEB-BROWSABLE WEB API'S

Page 6: DJANGO-REST-FRAMEWORK: AWESOME WEB-BROWSABLE WEB APIS

API (APPLICATION PROGRAMMING INTERFACE)

Uma Interface de Programação de Aplicação especifica comocertos componentes de software devem interagir uns com os

outros.

Page 7: DJANGO-REST-FRAMEWORK: AWESOME WEB-BROWSABLE WEB APIS

DJANGO-REST-FRAMEWORK

AWESOME WEB-BROWSABLE WEB API'S

Page 8: DJANGO-REST-FRAMEWORK: AWESOME WEB-BROWSABLE WEB APIS

MÉTODOS HTTPGETPOST

Page 9: DJANGO-REST-FRAMEWORK: AWESOME WEB-BROWSABLE WEB APIS

MÉTODOS HTTP (RFC 2616)GETPOSTHEADPUTDELETEOPTIONSTRACECONNECT

Page 10: DJANGO-REST-FRAMEWORK: AWESOME WEB-BROWSABLE WEB APIS

RESTFULL API

Utiliza todo o potencial do HTTP para servir recursos através demétodos (verbos)

Page 11: DJANGO-REST-FRAMEWORK: AWESOME WEB-BROWSABLE WEB APIS

EXEMPLO/user_list/user_create/user?id=xxx/user_edit?id=xxx/user_delete?id=xxx

Page 12: DJANGO-REST-FRAMEWORK: AWESOME WEB-BROWSABLE WEB APIS

EXEMPLO RESTFULLGET /userPOST /userGET /user/idPUT /user/idDELETE /user/id

Page 13: DJANGO-REST-FRAMEWORK: AWESOME WEB-BROWSABLE WEB APIS

DJANGO-REST-FRAMEWORKAWESOME WEB-BROWSABLE WEB API'S

Page 14: DJANGO-REST-FRAMEWORK: AWESOME WEB-BROWSABLE WEB APIS

DJANGO-REST-FRAMEWORKÉ um conjunto de ferramentas construidas a partir do Django

que facilitam a construção de API's REST

Page 15: DJANGO-REST-FRAMEWORK: AWESOME WEB-BROWSABLE WEB APIS

NÚMEROSCriador - Tom ChristieEstrelas - 1592Forks - 464Documentação

Page 16: DJANGO-REST-FRAMEWORK: AWESOME WEB-BROWSABLE WEB APIS

UMA VIEW SIMPLES

Page 17: DJANGO-REST-FRAMEWORK: AWESOME WEB-BROWSABLE WEB APIS

APIVIEWfrom rest_framework.views import APIViewfrom rest_framework.response import Responsefrom rest_framework.renderers import JSONRenderer

class PalestrantesView(APIView): renderer_classes = (JSONRenderer,)

def get(self, request, *args, **kwargs): data = [{'nome': 'Filipe', 'cidade': 'Recife', 'empresa': 'Vinta'}, {'nome': 'Fernando', 'cidade': 'Recife', 'empresa': 'Thinkr'}]

return Response(data)

Page 18: DJANGO-REST-FRAMEWORK: AWESOME WEB-BROWSABLE WEB APIS

RESPOSTAHTTP/1.1 200 OKContent-Type:application/json

[ { cidade: "Recife", empresa: "Vinta", nome: "Filipe" }, { cidade: "Recife", empresa: "Thinkr", nome: "Fernando" }]

Page 19: DJANGO-REST-FRAMEWORK: AWESOME WEB-BROWSABLE WEB APIS

RENDERIZADORES

Page 20: DJANGO-REST-FRAMEWORK: AWESOME WEB-BROWSABLE WEB APIS

DA PYTHON PARA TEXTOJSONRenderer

UnicodeJSONRenderer

JSONPRenderer

YAMLRenderer

XMLRenderer

TemplateHTMLRenderer

StaticHTMLRenderer

HTMLFormRenderer

BrowsableAPIRenderer

#BaseRenderer

Page 21: DJANGO-REST-FRAMEWORK: AWESOME WEB-BROWSABLE WEB APIS

JSONrenderer_classes = (JSONRenderer,)

HTTP/1.1 200 OKContent-Type:application/json

[ { "nome": "Filipe", "cidade": "Recife", "empresa": "Vinta" }, { "nome": "Fernando", "cidade": "Recife", "empresa": "Thinkr" }]

Page 22: DJANGO-REST-FRAMEWORK: AWESOME WEB-BROWSABLE WEB APIS

XMLrenderer_classes = (XMLRenderer,)

HTTP/1.1 200 OKContent-Type:application/xml

<?xml version="1.0" encoding="utf-8"?><root> <list-item> <cidade>Recife</cidade> <empresa>Vinta</empresa> <nome>Filipe</nome> </list-item> <list-item> <cidade>Recife</cidade> <empresa>Thinkr</empresa> <nome>Fernando</nome> </list-item></root>

Page 23: DJANGO-REST-FRAMEWORK: AWESOME WEB-BROWSABLE WEB APIS

BROWSABLE APIrenderer_classes = (BrowsableAPIRenderer,)

Page 24: DJANGO-REST-FRAMEWORK: AWESOME WEB-BROWSABLE WEB APIS

PARSERS

Page 25: DJANGO-REST-FRAMEWORK: AWESOME WEB-BROWSABLE WEB APIS

DE TEXTO PARA PYTHONJSONParser

YAMLParser

XMLParser

FormParser

MultiPartParser

FileUploadParser

#BaseParser

Page 26: DJANGO-REST-FRAMEWORK: AWESOME WEB-BROWSABLE WEB APIS

AUTENTICAÇÃO

Page 27: DJANGO-REST-FRAMEWORK: AWESOME WEB-BROWSABLE WEB APIS

BASTA DECLARARfrom rest_framework.views import APIViewfrom rest_framework.response import Responsefrom rest_framework.authentication import SessionAuthentication, \ TokenAuthentication

class PalestrantesView(APIView): authentication_classes = (SessionAuthentication, TokenAuthentication,) permission_classes = (IsAuthenticated,)

def get(self, request, *args, **kwargs): data = [{'nome': 'Filipe', 'cidade': 'Recife', 'empresa': 'Vinta'}, {'nome': 'Fernando', 'cidade': 'Recife', 'empresa': 'Thinkr'}] return Response(data)

Page 28: DJANGO-REST-FRAMEWORK: AWESOME WEB-BROWSABLE WEB APIS

FALHA NA AUTENTICAÇÃOHTTP/1.0 401 OK

HTTP_401_UNAUTHORIZEDHTTP/1.0 403 OK

HTTP_403_FORBIDDEN

Page 29: DJANGO-REST-FRAMEWORK: AWESOME WEB-BROWSABLE WEB APIS

AUTENTICAÇÃO PLUGÁVELBasicAuthentication

TokenAuthentication

SessionAuthentication

OAuthAuthentication

OAuth2Authentication

#BaseAuthentication

Page 30: DJANGO-REST-FRAMEWORK: AWESOME WEB-BROWSABLE WEB APIS

DEFININDO DEFAULT NO SETTINGSREST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework.authentication.SessionAuthentication', 'rest_framework.authentication.TokenAuthentication' ),}

Page 31: DJANGO-REST-FRAMEWORK: AWESOME WEB-BROWSABLE WEB APIS

SIMPLIFICANDO A VIEW

Page 32: DJANGO-REST-FRAMEWORK: AWESOME WEB-BROWSABLE WEB APIS

GENERICAPIVIEWmodels.py

from django.db import models

class Speaker(models.Model): name = models.CharField(u'Nome', max_length=50) city = models.CharField(u'Cidade', max_length=50) company = models.CharField(u'Empresa', max_length=50) phone = models.CharField(u'Telefone', max_length=12, blank=True)

views.pyfrom rest_framework import genericsfrom .models import Speaker

class SpeakerList(generics.ListCreateAPIView): ''' Endpoint que representa a lista de palestrantes, e permite que novos palestrantes sejam cadastrados. ''' model = Speaker

Page 33: DJANGO-REST-FRAMEWORK: AWESOME WEB-BROWSABLE WEB APIS

GET /SPEAKERS/HTTP/1.0 200 OKAllow: GET, POST, HEAD, OPTIONSContent-Type: application/json; charset=utf-8

[ { "city": "Recife", "company": "Thinkr", "id": 1, "name": "Fernando Rocha", "phone": "12345678" }, { "city": "Recife", "company": "Vinta", "id": 2, "name": "Filipe Ximenes", "phone": "12345678" }]

Page 34: DJANGO-REST-FRAMEWORK: AWESOME WEB-BROWSABLE WEB APIS

POST /SPEAKERS/request

{}

responseHTTP/1.0 400 BAD REQUESTAllow: GET, POST, HEAD, OPTIONSContent-Type: application/json; charset=utf-8

{ "city": [ "This field is required." ], "company": [ "This field is required." ], "name": [ "This field is required." ]}

Page 35: DJANGO-REST-FRAMEWORK: AWESOME WEB-BROWSABLE WEB APIS

POST /SPEAKERS/request

{'name': 'Daker', 'company': 'INTD', 'phone': '313131'}

responseHTTP/1.0 201 CREATEDAllow: GET, POST, HEAD, OPTIONSContent-Type: application/json; charset=utf-8

{ "city": "Recife", "company": "INTD", "id": 3, "name": "Daker" "phone": "313131"}

Page 36: DJANGO-REST-FRAMEWORK: AWESOME WEB-BROWSABLE WEB APIS

GENERIC VIEWSCreateAPIView

ListAPIView

RetrieveAPIView

DestroyAPIView

UpdateAPIView

ListCreateAPIView

RetrieveUpdateAPIView

RetrieveDestroyAPIView

RetrieveUpdateDestroyAPIView

Page 37: DJANGO-REST-FRAMEWORK: AWESOME WEB-BROWSABLE WEB APIS

CUSTOMIZANDO OS DADOS(SERIALIZADORES)

Page 38: DJANGO-REST-FRAMEWORK: AWESOME WEB-BROWSABLE WEB APIS

SERIALIZADORESConverte objetos de Python para listas e dicionáriosConverte dicionários e listas para objetos de PythonSemelhante a API de forms do Django

Page 39: DJANGO-REST-FRAMEWORK: AWESOME WEB-BROWSABLE WEB APIS

DEFININDO CAMPOSserializers.py

from rest_framework import serializersfrom .models import Speaker

class SpeakerSerializer(serializers.ModelSerializer): class Meta: model = Speaker fields = ('name', 'city', 'company')

Page 40: DJANGO-REST-FRAMEWORK: AWESOME WEB-BROWSABLE WEB APIS

UTILIZANDO GENERIC VIEWSserializers.py

from rest_framework import serializersfrom .models import Speaker

class SpeakerSerializer(serializers.ModelSerializer): class Meta: model = Speaker fields = ('name', 'city', 'company')

views.pyfrom rest_framework import genericsfrom .models import Speaker

class SpeakerList(generics.ListCreateAPIView): ''' Endpoint que representa a lista de palestrantes, e permite que novos palestrantes sejam cadastrados. ''' model = Speaker serializer_class = SpeakerSerializer

Page 41: DJANGO-REST-FRAMEWORK: AWESOME WEB-BROWSABLE WEB APIS

GET /SPEAKERS/HTTP/1.0 200 OKAllow: GET, POST, HEAD, OPTIONSContent-Type: application/json; charset=utf-8

[ { "city": "Recife", "company": "thinkr", "name": "Fernando Rocha," }, { "city": "Recife", "company": "Vinta", "name": "Filipe Ximenes," }, { "city": "Recife", "company": "INTD", "name": "Daker," }]

Page 42: DJANGO-REST-FRAMEWORK: AWESOME WEB-BROWSABLE WEB APIS

COMO FUNCIONA?views.py

from rest_framework import genericsfrom rest_framework.response import Responsefrom .models import Speaker

class SpeakerList(generics.APIView): ''' Endpoint que representa a lista de palestrantes, e permite que novos palestrantes sejam cadastrados. ''' def post(self, request): serializer = SpeakerSerializer(data=request.DATA)

if serializer.is_valid(): serializer.save() return Response(serializer.data, status=201) return Response(serializer.errros, status=400)

Page 43: DJANGO-REST-FRAMEWORK: AWESOME WEB-BROWSABLE WEB APIS

VALIDAÇÃOserializers.py

from rest_framework import serializersfrom .models import Speaker

class SpeakerSerializer(serializers.ModelSerializer): class Meta: model = Speaker fields = ('name', 'city', 'company')

def validate_name(self, attrs, source): if len(attrs[source].split()) < 2: raise serializers.ValidationError(u'Informe o nome e sobrenome') return attrs

Page 44: DJANGO-REST-FRAMEWORK: AWESOME WEB-BROWSABLE WEB APIS

POST /SPEAKERS/request

{'name': 'a', 'city': 'recife', 'company': 'test'}

responseHTTP/1.0 400 BAD REQUESTAllow: GET, POST, HEAD, OPTIONSContent-Type: application/json; charset=utf-8

{ "name": [ "Informe o nome e sobrenome" ]}

Page 45: DJANGO-REST-FRAMEWORK: AWESOME WEB-BROWSABLE WEB APIS

GET /SPEAKERS/HTTP/1.0 200 OKAllow: GET, POST, HEAD, OPTIONSContent-Type: application/json; charset=utf-8

[ { "city": "Recife", "company": "THINKR", "name": "Fernando Rocha," }, { "city": "Recife", "company": "VINTA", "name": "Filipe Ximenes," }, { "city": "Recife", "company": "INTD", "name": "Daker," }, ]

Page 46: DJANGO-REST-FRAMEWORK: AWESOME WEB-BROWSABLE WEB APIS

VIEWSETS

Page 47: DJANGO-REST-FRAMEWORK: AWESOME WEB-BROWSABLE WEB APIS

VIEWSETviews.py

from rest_framework import viewsetsfrom .models import Speaker

class SpeakerViewSet(viewsets.ModelViewSet): ''' Endpoint para visualizer e editar instâncias de Speaker ''' serializer_class = UserSerializer queryset = Speaker.objects.all()

Page 48: DJANGO-REST-FRAMEWORK: AWESOME WEB-BROWSABLE WEB APIS

FILIPE XIMENESgithub.com/filipeximenes

twitter.com/xima

FERNANDO ROCHAlivingintheshell.com

github.com/fernandogrdtwitter.com/fernandogrd