Aproveite o mês das
carreiras
na Alura

44% OFF

Falta pouco!

00

DIAS

00

HORAS

00

MIN

00

SEG

Django: Upload de imagens em uma API Rest

Guilherme Lima
Guilherme Lima

Compartilhe

Neste artigo, veja como podemos implementar o upload de imagens no Django REST Framework com um exemplo passo a passo.

Criando um modelo

Para permitir que um modelo possua um campo destinado à imagem, você pode utilizar o models.ImageField, como ilustra o exemplo de código abaixo.

from django.db import models
class Imagem(models.Model):
    descricao = models.CharField(max_length=30)
    foto = models.ImageField()
    def __str__(self):
        return self.descricao

Não se esqueça de realizar a migração deste modelo em seu banco de dados, com makemigrations e migrate.

Banner da Imersão de IA da Alura com Google Gemini. Participe de aulas gratuitas online com certificado. Domine as inovações mais recentes da IA.

Serializer

No serializer, vamos permitir que todos os campos do modelo de imagem estejam disponíveis:

from rest_framework import serializers
from imagens.models import Imagem
class ImagemSerializer(serializers.ModelSerializer):
    
    class Meta:
        model = Imagem
        fields = '__all__'

Configurando a View

Agora vamos criar a classe ImagemViewSet, indicando o queryset e a classe serializadora:

from rest_framework import viewsets
from imagens.serializers import ImagemSerializer
from imagens.models import Imagem
class ImagemViewSet(viewsets.ModelViewSet):
    queryset = Imagem.objects.all()
    serializer_class = ImagemSerializer

Configurações gerais do settings.py

Vamos utilizar o Pillow (travesseiro do inglês) que é uma biblioteca adicional gratuita e de código aberto para a linguagem de programação Python, que adiciona suporte para abrir, manipular e salvar muitos formatos de arquivo de imagens diferentes.

Para instalar, utilize o pip:

pip install pillow

Vamos configurar nosso arquivo settings.py criando o STATIC_URL, que é a URL que servirá os arquivos estáticos na aplicação. Em seguida, o MEDIA_ROOT indicando a pasta onde as imagens ou arquivos serão encontrados. Por último, o MEDIA_URL, indicando a URL das medias ao servidor, como ilustra o código abaixo:

STATIC_URL = '/static/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media_root')
MEDIA_URL = '/media/'

Caso o módulo os não seja encontrado, faça o import no início do arquivo:

from pathlib import Path, os

ou

import os

Incluindo

Após definir o router do rest_framework, é necessário incluir as urls e o caminho das imagens com sinal de soma(+) em nossa array de urlpatterns, como ilustra o código abaixo.

from django.urls import path, include
from django.conf import settings
from django.conf.urls.static import static
from rest_framework import routers
from imagens.views import ImagemViewSet
router = routers.DefaultRouter()
router.register('imagens', ImagemViewSet)
urlpatterns = [
    path('', include(router.urls)),
    path('admin/', admin.site.urls),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

Subindo o servidor

Ao subir o servidor no endpoint de imagens, vamos nos deparar com a seguinte imagem:

django rest

Criando uma imagem

Observe que podemos testar uma requisição POST e criar um novo recurso no Django Rest:

django rest

Neste link, você encontra uma API com o exemplo acima.

Conclusão

Para permitir requisições de arquivos ou imagens em uma API feita com Django Rest Framework é simples. Com poucas linhas de configurações, você pode evoluir ainda mais sua API.

Quer aprender ainda mais sobre Django, Veja também:

Formação Django da Alura

Curso de Django Rest API: Crie sua API do zero

Django ou Flask, eis a questão

Guilherme Lima
Guilherme Lima

Guilherme é desenvolvedor de software formado em Sistemas de Informação e possui experiência em programação usando diferentes tecnologias como Python, Javascript e Go. Criador de mais de 30 cursos de diferentes áreas da plataforma com foco no treinamento de profissionais de TI, como Data Science, Python para web com Django e Django Rest, jogos com Javascript, Infraestrutura como código com Terraform e Ansible, Orientação a Objetos com Go. Além disso, é um dos instrutores da Imersão Dev da Alura.

Veja outros artigos sobre Programação