Kaique Mitsuo Silva Yamamoto
Arquitetura software

Ecossistema Python

Python e uma das linguagens mais versateis, sendo usada em web development, data science, automacao, IA e muito mais. Este guia cobre o ecossistema para desenvolvimento backend.

Frameworks Web

FastAPI

Framework moderno, rapido e com tipagem automatica.

CaracteristicaDescricao
PerformanceUma das mais rapidas (Starlette + Pydantic)
TipagemType hints nativos com validacao
DocsOpenAPI/Swagger automatico
AsyncSuporte nativo a async/await
from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()

class Item(BaseModel):
    name: str
    price: float
    is_offer: bool = False

@app.get("/")
async def root():
    return {"message": "Hello World"}

@app.post("/items/")
async def create_item(item: Item):
    return item

Quando usar: APIs REST, microservicos, projetos que precisam de documentacao automatica.


Django

Framework "batteries included" para aplicacoes completas.

CaracteristicaDescricao
ORMORM poderoso incluido
AdminInterface administrativa automatica
AuthSistema de autenticacao completo
SegurancaProtecoes contra CSRF, XSS, SQL Injection
# models.py
from django.db import models

class Article(models.Model):
    title = models.CharField(max_length=200)
    content = models.TextField()
    published = models.DateTimeField(auto_now_add=True)

# views.py
from django.shortcuts import render
from .models import Article

def article_list(request):
    articles = Article.objects.all()
    return render(request, 'articles/list.html', {'articles': articles})

Quando usar: Aplicacoes web completas, CMSs, e-commerce, projetos que precisam de admin.

Django REST Framework

from rest_framework import serializers, viewsets
from .models import Article

class ArticleSerializer(serializers.ModelSerializer):
    class Meta:
        model = Article
        fields = '__all__'

class ArticleViewSet(viewsets.ModelViewSet):
    queryset = Article.objects.all()
    serializer_class = ArticleSerializer

Flask

Microframework minimalista e flexivel.

CaracteristicaDescricao
SimplicidadeMinimo para comecar
FlexibilidadeEscolha suas proprias ferramentas
ExtensoesEcossistema rico de plugins
from flask import Flask, jsonify, request

app = Flask(__name__)

@app.route('/api/items', methods=['GET', 'POST'])
def items():
    if request.method == 'POST':
        data = request.json
        return jsonify(data), 201
    return jsonify({"items": []})

if __name__ == '__main__':
    app.run(debug=True)

Quando usar: APIs simples, prototipagem, quando precisa de controle total.


Comparativo de Frameworks

FrameworkPerformanceCurva de AprendizadoIdeal Para
FastAPIAltaMediaAPIs, Microservicos
DjangoMediaAltaApps completas, Admin
FlaskMediaBaixaPrototipagem, APIs simples

ORMs e Bancos de Dados

SQLAlchemy

ORM mais popular e completo do Python.

from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

Base = declarative_base()

class User(Base):
    __tablename__ = 'users'

    id = Column(Integer, primary_key=True)
    name = Column(String(50))
    email = Column(String(100), unique=True)

engine = create_engine('postgresql://user:pass@localhost/db')
Session = sessionmaker(bind=engine)
session = Session()

# CRUD
user = User(name="Kaique", email="kaique@email.com")
session.add(user)
session.commit()

users = session.query(User).filter(User.name.like('%Kaique%')).all()

SQLModel

Combina SQLAlchemy com Pydantic (criado pelo autor do FastAPI).

from sqlmodel import SQLModel, Field, create_engine, Session

class User(SQLModel, table=True):
    id: int | None = Field(default=None, primary_key=True)
    name: str
    email: str

engine = create_engine("sqlite:///database.db")
SQLModel.metadata.create_all(engine)

with Session(engine) as session:
    user = User(name="Kaique", email="kaique@email.com")
    session.add(user)
    session.commit()

Tortoise ORM

ORM async-first, similar ao Django ORM.

from tortoise import fields
from tortoise.models import Model

class User(Model):
    id = fields.IntField(pk=True)
    name = fields.CharField(max_length=255)
    email = fields.CharField(max_length=255, unique=True)

    class Meta:
        table = "users"

Validacao e Serializacao

Pydantic

Biblioteca padrao para validacao de dados.

from pydantic import BaseModel, EmailStr, Field, validator
from datetime import datetime

class UserCreate(BaseModel):
    name: str = Field(..., min_length=2, max_length=50)
    email: EmailStr
    age: int = Field(..., ge=18, le=120)

    @validator('name')
    def name_must_be_alpha(cls, v):
        if not v.replace(' ', '').isalpha():
            raise ValueError('Nome deve conter apenas letras')
        return v.title()

class UserResponse(BaseModel):
    id: int
    name: str
    email: EmailStr
    created_at: datetime

    class Config:
        from_attributes = True

Async e Concorrencia

asyncio

import asyncio
import aiohttp

async def fetch_url(session, url):
    async with session.get(url) as response:
        return await response.json()

async def main():
    urls = [
        "https://api.example.com/1",
        "https://api.example.com/2",
        "https://api.example.com/3"
    ]

    async with aiohttp.ClientSession() as session:
        tasks = [fetch_url(session, url) for url in urls]
        results = await asyncio.gather(*tasks)
        return results

results = asyncio.run(main())

Celery

Task queue para processamento assincrono.

from celery import Celery

app = Celery('tasks', broker='redis://localhost:6379')

@app.task
def send_email(to, subject, body):
    # Logica de envio
    return f"Email enviado para {to}"

# Chamada assincrona
result = send_email.delay("user@email.com", "Assunto", "Corpo")
print(result.get())  # Espera resultado

Testes

Pytest

import pytest
from fastapi.testclient import TestClient
from main import app

client = TestClient(app)

def test_read_root():
    response = client.get("/")
    assert response.status_code == 200
    assert response.json() == {"message": "Hello World"}

@pytest.fixture
def sample_item():
    return {"name": "Test Item", "price": 9.99}

def test_create_item(sample_item):
    response = client.post("/items/", json=sample_item)
    assert response.status_code == 200
    assert response.json()["name"] == "Test Item"

@pytest.mark.asyncio
async def test_async_function():
    result = await some_async_function()
    assert result is not None

Ferramentas de Desenvolvimento

Poetry (Gerenciamento de Dependencias)

# Criar projeto
poetry new meu-projeto

# Adicionar dependencias
poetry add fastapi uvicorn
poetry add --group dev pytest black ruff

# Instalar dependencias
poetry install

# Executar
poetry run uvicorn main:app --reload

Ruff (Linting rapido)

# pyproject.toml
[tool.ruff]
line-length = 100
select = ["E", "F", "I", "N", "W"]
ignore = ["E501"]

[tool.ruff.isort]
known-first-party = ["myapp"]

Black (Formatacao)

# pyproject.toml
[tool.black]
line-length = 100
target-version = ['py311']

MyPy (Type Checking)

# pyproject.toml
[tool.mypy]
python_version = "3.11"
strict = true
warn_return_any = true

Estrutura de Projeto Recomendada

meu-projeto/
├── src/
│   └── myapp/
│       ├── __init__.py
│       ├── main.py
│       ├── config.py
│       ├── models/
│       │   ├── __init__.py
│       │   └── user.py
│       ├── schemas/
│       │   ├── __init__.py
│       │   └── user.py
│       ├── services/
│       │   ├── __init__.py
│       │   └── user_service.py
│       ├── repositories/
│       │   ├── __init__.py
│       │   └── user_repository.py
│       └── api/
│           ├── __init__.py
│           ├── deps.py
│           └── routes/
│               ├── __init__.py
│               └── users.py
├── tests/
│   ├── __init__.py
│   ├── conftest.py
│   └── test_users.py
├── pyproject.toml
├── Dockerfile
└── README.md

Recursos