Django: Upload de imagens em uma API Rest
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.
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:
Criando uma imagem
Observe que podemos testar uma requisição POST e criar um novo recurso no 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: