Django: Upload de imagens em uma API Rest

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 Escola de Programação: Matricula-se na escola de Programação. Junte-se a uma comunidade de mais de 500 mil estudantes. Na Alura você tem acesso a todos os cursos em uma única assinatura; tem novos lançamentos a cada semana; desafios práticos. Clique e saiba mais!

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