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.
| Caracteristica | Descricao |
|---|---|
| Performance | Uma das mais rapidas (Starlette + Pydantic) |
| Tipagem | Type hints nativos com validacao |
| Docs | OpenAPI/Swagger automatico |
| Async | Suporte 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 itemQuando usar: APIs REST, microservicos, projetos que precisam de documentacao automatica.
Django
Framework "batteries included" para aplicacoes completas.
| Caracteristica | Descricao |
|---|---|
| ORM | ORM poderoso incluido |
| Admin | Interface administrativa automatica |
| Auth | Sistema de autenticacao completo |
| Seguranca | Protecoes 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 = ArticleSerializerFlask
Microframework minimalista e flexivel.
| Caracteristica | Descricao |
|---|---|
| Simplicidade | Minimo para comecar |
| Flexibilidade | Escolha suas proprias ferramentas |
| Extensoes | Ecossistema 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
| Framework | Performance | Curva de Aprendizado | Ideal Para |
|---|---|---|---|
| FastAPI | Alta | Media | APIs, Microservicos |
| Django | Media | Alta | Apps completas, Admin |
| Flask | Media | Baixa | Prototipagem, 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 = TrueAsync 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 resultadoTestes
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 NoneFerramentas 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 --reloadRuff (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 = trueEstrutura 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