Contents

Criar uma API REST CRUD com visualizações baseadas em classe no Django REST Framework

Django Rest Framework (DRF) é uma estrutura Django que oferece suporte para a construção de APIs REST. Tal como o Django, o DRF permite-lhe construir as suas vistas de API com vistas baseadas em funções ou em classes.

Embora as visualizações baseadas em classe possam apresentar uma curva de aprendizado íngreme inicialmente, elas são caracterizadas por várias vantagens, como organização de código aprimorada, maior modularidade por meio de herança, reutilização aprimorada e sucinta na expressão.

Crie uma API de gerenciamento de receitas com o Django REST Framework

Um aplicativo de gerenciamento de receitas serve como uma excelente plataforma para explorar visualizações baseadas em classe no Django Rest Framework (DRF). Ao incorporar funcionalidades como a criação, modificação e eliminação de receitas, é possível compreender a implementação de funções CRUD (Create, Read, Update, Delete). Este guia irá instruí-lo na conceção de uma interface CRUD através de uma série de passos sequenciais.

O código-fonte deste tutorial está disponível para acesso e download na plataforma GitHub, que serve como um centro para os programadores colaborarem e partilharem o seu trabalho com outros sob a forma de repositórios de código aberto.

Etapa 1: instalar o Django REST Framework e configurar seu projeto

⭐ Crie um ambiente virtual para seu projeto e instale as seguintes dependências:

 pip install django djangorestframework

⭐ Crie um projeto Django chamado core com o seguinte comando:

 django-admin startproject core .

⭐ Crie um aplicativo chamado recipe_manager :

 python manage.py startapp recipe_manager

⭐ Abra seu arquivo core/settings.py e navegue até a lista INSTALLED_APPS para registrar seus aplicativos:

 INSTALLED_APPS = [
    # custom apps
    'rest_framework',
    'recipe_manager',
]

Passo 2: Crie um modelo para seu aplicativo de receita

⭐ Abra seu arquivo recipe_manager/models.py e crie um modelo para seu aplicativo. Aqui está um exemplo básico de um modelo de receita:

 # models.py
from django.db import models

class Recipe(models.Model):
    recipe_name = models.CharField(max_length=255)
    ingredients = models.TextField()
    instructions = models.TextField()

⭐ Crie migrações e migre seu modelo para o banco de dados com este comando:

 python manage.py makemigrations && python manage.py migrate

Passo 3: Crie um serializador para seu aplicativo

Um serializador serve como parte integrante do framework Django, facilitando a conversão de estruturas de dados complexas, incluindo conjuntos de consultas, em formatos adequados para renderização, abrangendo exemplos como JSON ou XML.

Para criar um serializador, siga estes passos:

⭐Crie um ficheiro chamadorecipe_manager/serializers.py.

⭐ Importe o módulo de serializadores, bem como o modelo que pretende serializar:

 # serializers.py
from rest_framework import serializers

from .models import Recipe # the model to serialize

⭐ No mesmo ficheiro, crie uma classe de serializador para o seu modelo e defina a classe Meta:

 # serializers.py
class RecipeSerializer(serializers.ModelSerializer):
    class Meta:
        model = Recipe
        fields = ('recipe_name', 'ingredients', 'instructions')

Neste código, a classe Meta define o modelo a serializar e os campos específicos que o serializador deve tratar. O atributo fields pode ser uma lista ou uma tupla. Se quiser serializar todos os campos do seu modelo, pode fazê-lo assim:

 class Meta:
 fields = "__all__"

Passo 4: Escrever uma view para a operação CREATE

Você pode criar views baseadas em classes para seu aplicativo importando a view genérica disponível no Django. Você pode ler sobre essas views na documentação oficial do Django . Para implementar a operação CREATE do CRUD, você deve importar o CreateAPIView . Você também deve importar seu serializador e modelo:

 # views.py
from rest_framework.generics import CreateAPIView

from .models import Recipe
from .serializers import RecipeSerializer

Para implementar o processo de criação de uma nova entidade dentro de uma view específica usando a API REST, tudo o que é necessário é designar o método de serialização particular que a view deve empregar. Um exemplo demonstrativo disto pode ser observado da seguinte forma:

 # Create view
class RecipeCreateView(CreateAPIView):
    serializer_class = RecipeSerializer

A utilização desta configuração permite a execução de pedidos POST para a sua aplicação.

Etapa 5: Escrever uma view para a operação READ

⭐ Para implementar a operação READ, importe a ListAPIView para suas views. Esta vista ajuda-o a listar os objectos do modelo:

 # views.py
from rest_framework.generics import CreateAPIView, ListAPIView

⭐ Crie uma classe para as suas vistas e especifique o serializador e o conjunto de consultas a utilizar:

 # List view
class RecipeListView(ListAPIView):
    serializer_class = RecipeSerializer
    queryset = Recipe.objects.all()

⭐ Crie uma vista para ler uma receita específica. Para fazer isso, você precisa do RetrieveAPIView, então adicione-o à sua lista de importações:

 # views.py
from rest_framework.generics import CreateAPIView, ListAPIView, RetrieveAPIView

De seguida, crie a vista de que necessita:

 # Retrieve view
class RecipeRetrieveView(RetrieveAPIView):
    serializer_class = RecipeSerializer
    queryset = Recipe.objects.all()

Passo 6: Escrever vistas para as operações UPDATE e DELETE

Para executar as operações UPDATE e DELETE, é necessário utilizar as respectivas vistas da API, nomeadamente UpdateAPIView e DestroyAPIView . Por conseguinte, estas vistas devem ser importadas em conformidade.

 from rest_framework.generics import (
    ListAPIView,
    CreateAPIView,
    RetrieveAPIView,
    UpdateAPIView, # new
    DestroyAPIView, # new
)

Em seguida, implementaremos as exibições necessárias que herdarão tanto de UpdateAPIView quanto de DestroyAPIView , respetivamente:

 # Update view
class RecipeUpdateView(UpdateAPIView):
    serializer_class = RecipeSerializer
    queryset = Recipe.objects.all()

# Delete view
class RecipeDeleteView(DestroyAPIView):
    serializer_class = RecipeSerializer
    queryset = Recipe.objects.all()

Passo 7: Crie URLs para seu aplicativo

⭐ Adicione este código ao core/urls.py para configurar seus URLS:

 from django.urls import path, include

urlpatterns = [
    path('api/', include('recipe_manager.urls'))
]

⭐ Adicione o seguinte código ao seu arquivo recipe_manager/urls.py:

 from django.urls import path
from . import views

urlpatterns = [
    # List view (Read all)
    path('recipes/', views.RecipeListView.as_view(), name='recipe-list'),

    # Create view
    path('recipes/create/', views.RecipeCreateView.as_view(), name='recipe-create'),

    # Retrieve view (Read one)
    path('recipes/<int:pk>/', views.RecipeRetrieveView.as_view(), name='recipe-retrieve'),

    # Update view
    path('recipes/<int:pk>/update/', views.RecipeUpdateView.as_view(), name='recipe-update'),

    # Delete view
    path('recipes/<int:pk>/delete/', views.RecipeDeleteView.as_view(), name='recipe-destroy'),
]

No código acima, você observará que as exibições baseadas em classe usam a função as_view() para criar seus padrões de URL. Você também pode ler sobre as diferenças entre um projeto e um aplicativo no Django se você estiver confuso com o uso deles aqui.

Passo 8: Teste seus endpoints de API

Do seu diretório de projeto, execute o seguinte:

 python manage.py runserver 

Espera-se que essa ação inicie o servidor, execute determinadas inspeções e produza um endereço da Web que permita o acesso remoto.

Pode agora validar os seus pontos de extremidade da API visitando os URIs correspondentes, como “/api/recipes/”, e utilizando vários métodos de pedido HTTP para efetuar operações CRUD. Prevê-se que se depare com uma interface de utilizador padrão semelhante à apresentada abaixo:

/pt/images/django-s-default-api-testing-interface.jpg

Em alternativa, em vez de utilizar um navegador Web, pode optar-se por utilizar a aplicação Postman para testar e interagir com APIs.

Praticando DRY ao criar uma API CRUD

A adoção do princípio de programação conhecido como “DRY” é altamente recomendada para melhorar o calibre geral do seu código. Esse princípio, que significa “Não se repita”, incentiva os desenvolvedores a evitar a duplicação de código e, em vez disso, buscar a eficiência reutilizando componentes existentes ou criando novos quando necessário. Ao fazê-lo, não só se poupa tempo, como também se garante que o código se mantém consistente e passível de manutenção ao longo do tempo.

Considerando as perspectivas discutidas anteriormente, vale a pena notar que a utilização das vistas genéricas ListCreateAPIView e RetrieveUpdateDestroyAPIView pode reduzir significativamente a redundância no seu código.

A ListCreateAPIView é uma combinação da ListAPIView e da CreateAPIView, ao passo que a RetrieveUpdateDestroyAPIView une a funcionalidade de Obtenção da RetrieveAPIView com as capacidades de Atualização e Eliminação encontradas na UpdateAPIView e na DestroyAPIView, respetivamente.

É possível alterar as suas perspectivas anteriores, adoptando um esquema semelhante ao seguinte exemplo:

 from rest_framework.generics import ListCreateAPIView, RetrieveUpdateDestroyAPIView

from .models import Recipe
from .serializers import RecipeSerializer

class RecipeListCreateAPIView(ListCreateAPIView):
    serializer_class = RecipeSerializer
    queryset = Recipe.objects.all()

class RecipeRetrieveUpdateDeleteAPIView(RetrieveUpdateDestroyAPIView):
    serializer_class = RecipeSerializer
    queryset = Recipe.objects.all()

A utilização deste método resulta numa estrutura de codificação mais concisa e simplificada, minimizando assim a acumulação de linhas de código excessivas.

Para gerar ligações para vistas recém-criadas, pode seguir estes passos:

 from django.urls import path
from .views import RecipeListCreateAPIView, RecipeRetrieveUpdateDeleteAPIView

urlpatterns = [
    # List and Create view
    path('recipes/', RecipeListCreateAPIView.as_view(), name='recipe-list-create'),

    # Retrieve, Update, and Delete view
    path('recipes/<int:pk>/', RecipeRetrieveUpdateDeleteAPIView.as_view(), name='recipe-retrieve-update-destroy'),
]

Pode avaliar estes pontos de extremidade utilizando um

As vistas genéricas baseadas em classes facilitam o seu trabalho

Acima, foi demonstrado que a utilização de vistas genéricas baseadas em classes pode acelerar o procedimento de construção de vistas. Atualmente, tudo o que é necessário é herdar a APIView apropriada de acordo com a aplicação específica de cada um.

Recomenda-se que siga técnicas de programação correctas para evitar a criação de código não optimizado.