API REST do Django

Resumo : neste tutorial, você aprenderá como construir uma API simples que retorna uma lista de todos e um detalhe de um todo usando apenas Django.

Criando um ambiente virtual

Primeiro, crie um novo diretório chamado django_rest_api:

mkdir django_rest_api

Segundo, navegue até o django_rest_apidiretório:

cd django_rest_apiLinguagem de código:  Python  ( python )

Terceiro, crie um ambiente virtual usando o módulo integrado venv:

python -m venv venvLinguagem de código:  Python  ( python )

Quarto, ative o ambiente virtual:

venv/scripts/activate

Quinto, instale o djangopacote usando o comando pip:

pip install djangoLinguagem de código:  Python  ( python )

Por fim, crie o requirements.txtarquivo:

pip freeze > requirements.txtLinguagem de código:  Python  ( python )

Criando um novo projeto Django

Primeiro, crie um novo projeto Django chamado todolist:

django-admin startproject todolist

Segundo, navegue até o diretório do projeto:

cd todolistLinguagem de código:  Python  ( python )

Criando um novo aplicativo Django

Primeiro, crie um novo aplicativo chamado tododentro do todolistprojeto:

django-admin startapp todoLinguagem de código:  Python  ( python )

Segundo, registre o todoaplicativo settings.pyno todolistprojeto

INSTALLED_APPS = [
    ...
    'todo.apps.TodoConfig',
]Linguagem de código:  Python  ( python )

Definindo o modelo Todo

Primeiro, defina o Todomodelo no models.pyaplicativo todo:

from django.db import models
from django.contrib.auth.models import User


class Todo(models.Model):
    title = models.CharField(max_length=255)
    completed = models.BooleanField(default=False)
    user = models.ForeignKey(User, on_delete=models.CASCADE)

    def __str__(self):
        return self.titleLinguagem de código:  Python  ( python )

O Todomodelo possui três campos: title, completed, e user.

Faz userreferência ao Usermodelo do djangopacote, que especifica a conta que criou o todo.

Segundo, registre o Todomodelo no site de administração modificando o código no admin.pyaplicativo todo:

from django.contrib import admin
from .models import Todo

admin.site.register(Todo)Linguagem de código:  Python  ( python )

Ao fazer isso, você pode gerenciar no todosite de administração do Django.

Fazendo migrações e modelos de migração

Primeiro, faça uma nova migração:

python manage.py makemigrationsLinguagem de código:  Python  ( python )

Segundo, migre as migrações para sincronizar os modelos com o banco de dados:

python manage.py migrateLinguagem de código:  Python  ( python )

Terceiro, crie um usuário superadministrador para entrar no site de administração do Django:

python manage.py createsuperuserLinguagem de código:  Python  ( python )

Vamos ligar para o usuário john.

Finalmente, inicie o servidor de desenvolvimento Django:

python manage.py runserverLinguagem de código:  Python  ( python )

Criando alguns todos

Primeiro, faça login no site de administração através da URL http://localhost:8000/adminusando o superusuário johncriado acima:

site de administração django-rest-api

E adicione alguns todos:

Construindo uma API com Django

Construiremos uma API apenas com Django. A API terá dois endpoints:

  • todos/retorna todos todos.
  • todos/idretorna as informações de uma tarefa específica especificada por id. Por exemplo, todos/1retorna as informações do todo com id 1.

Primeiro, crie duas funções de visualização dentro do views.pyaplicativo todo:

from django.http import JsonResponse
from django.core.exceptions import ObjectDoesNotExist

from .models import Todo


def todo_list(request):
    """ Return all todos
    """
    # get all todos
    todos = Todo.objects.all()

    # prepare data to return
    data = {'todos': list(todos.values())}

    # return JSON
    return JsonResponse(data)


def todo_detail(request, pk):
    """ Return a todo instance
    """
    try:
        # find todo by id
        todo = Todo.objects.get(pk=pk)
    except ObjectDoesNotExist:
        # return 404 if the todo does not exists
        return JsonResponse({
            'status_code': 404,
            'error': f'Todo with id {pk} not found.'
        })
    else:
        # prepare data to return
        data = {
            'id': todo.id,
            'title': todo.title,
            'completed': todo.completed,
            'user': todo.user.username,
        }

        # return JSON
        return JsonResponse(data)Linguagem de código:  Python  ( python )

Como funciona.

  • A todo_list()função obtém todos os todos como um conjunto de consultas, formata-os como um dicionário e retorna uma resposta JSON usando o JSONResponseobjeto.
  • A todo_detail()função obtém uma tarefa por id e retorna uma resposta JSON com 404 se a tarefa não existir. Caso contrário, ele retorna os detalhes de um modelo de tarefas, incluindo informações de nome de usuário.

Segundo, crie urls.pydentro do todoaplicativo e inclua-o no urls.pyprojeto:

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('todo.urls')), # new
]Linguagem de código:  Python  ( python )

Mapeia urls.pyos endpoints da API com as visualizações de função:

from django.urls import path
from .views import todo_list, todo_detail

urlpatterns = [
    path('todos/', todo_list, name='todo-list'),
    path('todos/<int:pk>', todo_detail, name='todo-detail'),
]Linguagem de código:  Python  ( python )

Terceiro, abra o http://localhost:8000/todos/endpoint no navegador da web, você verá três todos no formato JSON:

{
  "todos": [
    {
      "id": 1,
      "title": "Learn Python",
      "completed": false,
      "user_id": 1
    },
    {
      "id": 2,
      "title": "Study Django",
      "completed": false,
      "user_id": 1
    },
    {
      "id": 3,
      "title": "Master Django REST API",
      "completed": false,
      "user_id": 1
    }
  ]
}Linguagem de código:  JSON/JSON com comentários  ( json )

Quarto, abra o endpoint do todo id 1 http://localhost:8000/todos/1e você verá a seguinte resposta JSON:

{
  "id": 1,
  "title": "Learn Python",
  "completed": false,
  "user": "john"
}Linguagem de código:  JSON/JSON com comentários  ( json )

Finalmente, se você abrir um endpoint que não existe, por exemplo, http://localhost:8000/todos/10, você receberá um erro 404:

{
  "status_code": 404,
  "error": "Todo with id 10 not found."
}Linguagem de código:  JSON/JSON com comentários  ( json )

Como você pode ver, o Django é capaz de construir APIs. Mas requer muito esforço para serializar as instâncias do modelo do Django em JSON e vice-versa.

Além disso, se você quiser adicionar mais recursos à API, como paginação, limitação de taxa, autenticação de token, etc. O Django não fornece todos esses recursos prontos para uso.

É por isso que o Django REST Framework entra em ação. Aprenderemos como desenvolver uma API totalmente RESTful usando o Django REST Framework nos próximos tutoriais.

Baixe o código fonte do projeto

Clique no link a seguir para baixar o código-fonte do projeto:

Baixe o projeto da API REST do Django

Resumo

  • Django é capaz de construir APIs, mas requer muito esforço, pois não fornece recursos de API prontos para uso.
  • Use um pacote de terceiros como Django Rest Framework para construir APIs com eficiência.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *