Boa parte do projeto foi beaseado nesse vídeo e nesse artigo. Se assim como eu, você entrou agora no mundo BackEnd, recomendo fortemente tais materiais.
Escrevi esse readme com a intenção de revisar o que aprendi e também ajudar aqueles com caminhos similares no mundo tech. Espero que você aprenda algo novo!👍
API para uma biblioteca
- Introdução
- Preparando o Ambiente
- Projeto x App
- Criando os modelos e API
- Criação das rotas
- Getting Started
Introdução
A ideia do projeto é que possamos armazenar livros e seus atributos dentro de um banco de dados e realizar as operações de CRUD sem precisar de uma interface gráfica. Assim, outra aplicação poderá se comunicar com a nossa de forma eficiente.
Esse é o conceito de API (Application Programming Interface)
Preparando o ambiente
Aqui temos a receita de bolo pra deixar a sua máquina pronta para levantar um servidor com o django e receber aquele 200 bonito na cara
>python -m venv venv #criando ambiente virtual na sua versao do python
>./venv/Scripts/Activate.ps1 #Ativando o ambiente virtual
>pip install django djangorestframework #instalação local das nossas dependências
>pip install pillow #biblioteca pra lidar com imagens
O lance do ambiente virtual é que todas suas dependências (que no python costumam ser muitas) ficam apenas num diretório específico.
Logo, com uma venv você pode criar projetos que usam versões diferentes da mesma biblioteca sem que haja conflito na hora do import.
Projeto x App
No django cada project pode carregar múltiplos apps, como um projeto site de esportes que pode ter um app para os artigos, outro para rankings etc.
Ainda no terminal usamos os comandos a seguir para criar o project library que vai carregar nosso app books.
>django-admin startproject library . #ponto indica diretório atual
>django-admin startapp books
>python manage.py runserver #pra levantarmos o servidor local com a aplicação
Sua estrutura de pastas deve estar assim:
Para criar as tabelas no banco de dados (Por enquanto Sqlite3) executamos o comando
>python manage.py migrate
Isso evita que a notificação unapplied migrations apareça na próxima vez que você levantar o servidor
Criando os modelos e API
No arquivo ./library/settings.py precisamos indicar ao nosso projeto library sobre a existência do app books e também o uso do rest framework. Portanto adicionamos as seguintes linhas sublinhadas
Já que nossa API suporta imagens como atributos também sera necessário o seguite acrescimo de codigo em ./library/settings.py
MEDIA_URL = '/media'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
Agora em ./library/books/models.py iremos criar nosso modelo com os atributos que um livro deve ter.
from django.db import models
from uuid import uuid4
#funcao pra receber as imagens e gerar endereço
def upload_image_books(instance, filename):
return f"{instance.id_book}-{filename}"
class Books(models.Model):
#criando os atributos do livro
id_book = models.UUIDField(primary_key=True, default=uuid4, editable=False)
title = models.CharField(max_length=255)
author = models.CharField(max_length=255)
release_year = models.IntegerField()
image = models.ImageField(upload_to=upload_image_books, blank=False, null=True)
Serializers e Viewsets
Dentro de ./library/books iremos criar a pasta /api com os arquivos
- serializers.py
- viewsets.py
Serializers
from rest_framework import serializers
from books import models
class BooksSerializer(serializers.ModelSerializer):
class Meta:
model = models.Books
fields = '__all__' #todos os campos do model id_book, author..
Viewsets
from rest_framework import viewsets
from books.api import serializers
from books import models
class BooksViewSet(viewsets.ModelViewSet):
serializer_class = serializers.BooksSerializer
queryset = models.Books.objects.all() #tambem todos os campos do nosso modelo
Criação das rotas
Agora com o viewset e o serializer a única coisa que falta é uma rota. Portanto vamos para ./library/urls.py resolver esse problema
from django.contrib import admin
from django.urls import path, include
from django.conf.urls.static import static
from django.conf import settings
from rest_framework import routers
from books.api import viewsets as booksviewsets
#criando nosso objeto de rota
route = routers.DefaultRouter()
route.register(r'books', booksviewsets.BooksViewSet, basename="Books")
urlpatterns = [
path('admin/', admin.site.urls),
path('', include(route.urls))
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
Como criamos um modelo novo lá em cima, precisamos avisar e em seguida migrar todos essas novas informações para o banco de dados
>python manage.py makemigrations
>python manage.py migrate
>python manage.py runserver
Agora você pode usar um programa como Insomnia para testar os métodos http no link do seu servidor local.
O python facilita bastante coisas para a gente, como os serializers (que convertem objetos para strings na comunicação cliente-servidor) e os verbos http (GET, POST, PUT, DELETE) que de certa forma também vem por padrão. Não me aprofundei neles durante o readme porque também preciso entender melhor como essas coisas funcionam
Getting Started
# Clone repository
git clone https://github.com/Mesheo/Biblioteca-API.git && cd Biblioteca-API
# Create Virtual Environment
python -m venv venv && ./venv/Scripts/Activate.ps1
# Install dependencies
pip install django djangorestframework
# Run Application
python manage.py runserver