Tutorial Django REST Framework¶
Nesse tutorial criaremos um projetinho básico de cadastro de Bandas/Músicas/Álbuns chamado spotifake.
Preparativos¶
Inicie o projeto criando um diretório (pasta) com o nome do projeto (spotifake).
Dentro da pasta, crie um ambiente virtual (venv)
python -m venv venv
Ative o ambiente virtual (no Windows). Não é necessário entrar na pasta, mas se entrar, lembre-se de voltar para a pasta raiz do projeto (spotifake):
.\venv\Scripts\Activate.ps1
Com o venv
ativado, instale o Django:
pip install django djangorestframework
Inicie um projeto Django chamado config
. Atente ao .
no final. Essa pasta config
contém os arquivos básicos gerados pelo Django. Perceba que ele também cria um arquivo manage.py
que vai ser responsável pelos comandos de gerenciamento do projeto daqui pra frente.
django-admin startproject config .
Inicie um aplicativo para seu projeto chamado api
. Vai aparecer uma pasta chamada api
com os arquivos básicos do aplicativo, como models.py
, views.py
, etc.
python manage.py startapp api
O novo app deve ser adicionado ao INSTALLED_APPS
do arquivo settings.py
, na pasta config
. Além disso já vamos adicionar o app rest_framework
ao settings.py
# Application definition
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework',
'api',
]
Já que iniciamos os arquivos básicos, podemos iniciar um projeto Git na pasta também, porém para que nenhum arquivo desnecessário vá para o repositório, criaremos um arquivo .gitignore
com o conteúdo abaixo.
venv
__pycache__
*.sqlite3
Para iniciar o projeto Git:
git init
E o primeiro commit, adicionando todos os arquivos do diretório, exceto os que estão no .gitignore
:
git add .
git commit -m "Commit inicial"
Desenvolvimento da API¶
Iniciaremos o projeto definindo os Models, responsáveis pela estrutura de dados do sistema.
Nosso arquivo models.py
terá o seguinte conteúdo:
from django.db import models
class Artista(models.Model):
nome = models.CharField(max_length=100)
local = models.CharField(max_length=100)
ano_criacao = models.IntegerField()
class Album(models.Model):
artista = models.ForeignKey(Artista, on_delete=models.CASCADE)
nome = models.CharField(max_length=100)
ano = models.IntegerField()
class Musica(models.Model):
album = models.ForeignKey(Album, on_delete=models.CASCADE)
nome = models.CharField(max_length=100)
segundos = models.IntegerField()
Com os Models definidos, vamos escrever no banco de dados usando as migrations. Para criar as migrations:
python manage.py makemigrations
E para aplicar:
python manage.py migrate
Faremos isso sempre que os Models forem modificados, ou quando vamos inicializar o projeto em outro computador.
Para o DRF (Django REST Framework) vamos criar o arquivo serializers.py
(dentro do diretório do app). Os serializers são responsáveis por traduzir os objetos do nosso sistema em strings JSON, que serão enviadas ao cliente e vice-versa.
from rest_framework import serializers
from .models import Artista, Album, Musica
class ArtistaSerializer(serializers.ModelSerializer):
class Meta:
model = Artista
fields = '__all__'
class AlbumSerializer(serializers.ModelSerializer):
class Meta:
model = Album
fields = '__all__'
class MusicaSerializer(serializers.ModelSerializer):
class Meta:
model = Musica
fields = '__all__'
Agora podemos criar as views, que são responsáveis pela comunicação com o cliente.
from django.shortcuts import render
from rest_framework import viewsets
from .models import Artista, Album, Musica
from .serializers import ArtistaSerializer, AlbumSerializer, MusicaSerializer
class ArtistaViewSet(viewsets.ModelViewSet):
"""
Permite a manipulação de dados de Artistas
"""
queryset = Artista.objects.all()
serializer_class = ArtistaSerializer
class AlbumViewSet(viewsets.ModelViewSet):
"""
Permite a manipulação de dados de Albuns
"""
queryset = Album.objects.all()
serializer_class = AlbumSerializer
class MusicaViewSet(viewsets.ModelViewSet):
"""
Permite a manipulação de dados de Músicas
"""
queryset = Musica.objects.all()
serializer_class = MusicaSerializer
Por último, vamos configurar as rotas/URLs do sistema, em uma API REST também chamados de endpoints.
O arquivo urls.py
da pasta config
deve ser:
from django.contrib import admin
from django.urls import path, include
from rest_framework import routers
from api import views
router = routers.DefaultRouter()
router.register(r'artistas', views.ArtistaViewSet)
router.register(r'albuns', views.AlbumViewSet)
router.register(r'musicas', views.MusicaViewSet)
# Wire up our API using automatic URL routing.
urlpatterns = [
path('admin/', admin.site.urls),
path('', include(router.urls)),
]
urlpatterns += router.urls
Nossa API está pronta. Obviamente esse é um exemplo bem básico, mas já é possível fazer requests e testar a API usando:
python manage.py runserver
E acessando o serviço em http://127.0.0.1:8000/. Não esqueça de adicionar e fazer o commit dos arquivos criados.
Opcional: Configurando o Admin¶
Primeiro crie um superuser:
python manage.py createsuperuser
Configure o arquivo admin.py
para mostrar todos os Models.
from django.contrib import admin
from .models import Artista, Album, Musica
admin.site.register(Artista)
admin.site.register(Album)
admin.site.register(Musica)
Para uma melhor visualização, é interessante criar os métodos __str__()
para cada Model:
def __str__(self):
return self.nome
Opcional: Rotas Aninhadas (Nested Routes)¶
O DRF não aceita rotas aninhadas por padrão, por exemplo, para ver os albuns do artista com id 1, não poderíamos usar: /artista/1/albuns
.
Para obter essa funcionalidade, use o pacote drf-nested-routers.
pip install drf-nested-routers
Veja a documentação aqui para mais detalhes.
Opcional: CORS Headers¶
A política de Cross Origin Resource Sharing dos bloqueia requisições entre serviços diferentes, a não ser que explicitamente habilitados pelos headers (cabeçalhos) CORS.
O objetivo é aumentar a segurança evitando a comunicação com cliente não habilitados.
Para habilitar os CORS headers no DRF usamos o pacote django-cors-header
Siga a documentação para instalar e habilitar e configure a variável CORS_ALLOWED_ORIGINS
ou CORS_ALLOW_ALL_ORIGINS
em config/settings.py