Instalação e Configuração de Ambiente — Gerenciador de Pacotes Rápido UV
Um bom ambiente de desenvolvimento é como uma cozinha totalmente equipada—os ingredientes (dependências) ficam disponíveis em questão de segundos, o fogão (servidor) acende com um clique, e a receita (estrutura do projeto) está bem organizada.
1. O Que Você Vai Aprender
- Instalação do UV e Comandos Centrais: Fluxo de trabalho para
uv init,uv addeuv run - Criando o Esqueleto do Projeto PriceTracker: Estrutura de Diretórios e Convenções de Nomenclatura
- Configurações do servidor de desenvolvimento Uvicorn:
--reload,--host,--port,--workers - Gerenciamento de Variáveis de Ambiente
.enve Integração com python-dotenv - Use
uv run uvicornpara iniciar o serviço de desenvolvimento com um clique
2. A História Real da Alice
(1) Problema: pip é lento como uma lesma ao instalar dependências
Alice usou pip para instalar dependências do seu projeto FastAPI, e levou três minutos para terminar. Para piorar, Bob na equipe estava usando Python 3.11, enquanto Alice usava 3.12—a incompatibilidade de versões causava conflitos frequentes em seus ambientes virtuais. Toda vez que pip install -r requirements.txt roda, é como jogar na loteria—você nunca sabe se vai falhar devido a um conflito de versão com algum lock file.
(2) Solução com o UV
UV é um gerenciador de pacotes Python escrito em Rust pela equipe Astral. Ele instala dependências 10 a 100 vezes mais rápido que o pip, possui gerenciamento integrado de ambiente virtual e troca de versão do Python, e permite inicializar um projeto com um único comando.
# Inicializar projeto e adicionar FastAPI de uma vez
uv init pricetracker
cd pricetracker
uv add fastapi uvicorn
uv run uvicorn app.main:app --reload
(3) Resultado
O tempo de instalação de dependências da Alice caiu de 3 minutos para 3 segundos; Bob e Alice têm ambientes idênticos (versão travada no uv.lock), e os tempos de build CI/CD foram reduzidos em 80%.
3. Noções Básicas do Gerenciador de Pacotes UV
(1) Referência Rápida dos Comandos Centrais do UV
| Comando | Função | Equivalente pip |
|---|---|---|
uv init |
Inicializar o projeto | Criar venv + requirements.txt manualmente |
uv add <pkg> |
Adicionar uma dependência ao pyproject.toml | pip install + Atualizar requirements.txt manualmente |
uv remove <pkg> |
Remover Dependência | pip uninstall + Atualização Manual |
uv run <cmd> |
Executar Comandos no Ambiente Virtual | source venv/bin/activate && cmd |
uv sync |
Sincronizar Todas as Dependências | pip install -r requirements.txt |
uv lock |
Travamento de Versões de Dependência | pip freeze > requirements.txt |
uv python install 3.12 |
Instalar Python | pyenv install 3.12 |
(1) ▶ Exemplo: Inicializando um Projeto UV
# Criar diretório do projeto
uv init pricetracker
cd pricetracker
# Isso cria:
# pricetracker/
# pyproject.toml
# .python-version
# hello.py
# .venv/ (ambiente virtual criado automaticamente)
Saída:
Initialized project pricetracker
(2) ▶ Exemplo: Adicionando uma dependência FastAPI
# Adicionar FastAPI e Uvicorn
uv add fastapi uvicorn[standard]
# Verificar pyproject.toml
cat pyproject.toml
Saída (trecho do pyproject.toml):
[project]
name = "pricetracker"
version = "0.1.0"
requires-python = ">=3.11"
dependencies = [
"fastapi>=0.115.0",
"uvicorn[standard]>=0.30.0",
]
(2) Comparação entre UV, pip e Poetry
| Dimensão | UV | pip | Poetry |
|---|---|---|---|
| Velocidade de Instalação | 10-100x mais rápido | Referência | 2-5x mais rápido |
| Lock File | uv.lock |
Nenhum | poetry.lock |
| Ambiente Virtual | Gerenciamento Automático | venv manual |
Gerenciamento Automático |
| Gerenciamento de Versão Python | Integrado | Nenhum | Requer pyenv |
| Arquivo de Configuração | pyproject.toml |
requirements.txt |
pyproject.toml |
| Núcleo Rust | Sim | Não | Não |
4. Esqueleto do Projeto PriceTracker
(1) Design da Estrutura de Diretórios
graph TD
Root[pricetracker/] --> App[app/]
App --> Main[__init__.py]
App --> MainPy[main.py]
App --> Api[api/]
Api --> Routes[routes/]
Routes --> Products[products.py]
Routes --> Prices[prices.py]
Routes --> Auth[auth.py]
App --> Models[models/]
App --> Schemas[schemas/]
App --> Services[services/]
App --> Core[core/]
Core --> Config[config.py]
Core --> Security[security.py]
App --> Db[db.py]
Root --> Tests[tests/]
Root --> Alembic[alembic/]
Root --> Docker[docker/]
Root --> Env[.env]
Root --> Pyproject[pyproject.toml]
| Diretório | Responsabilidades | Descrição |
|---|---|---|
app/ |
Pacote Principal da Aplicação | Todo o Código de Negócio |
app/api/routes/ |
Módulo de Rotas | Decompor Endpoints por Função |
app/models/ |
Modelos SQLAlchemy | Mapeamentos de Tabelas do Banco de Dados |
app/schemas/ |
Modelos Pydantic | Validação de Requisição/Resposta |
app/services/ |
Lógica de Negócio | Camada de Armazenamento e Camada de Serviço |
app/core/ |
Configuração Central | Configuração, Segurança, Dependências |
tests/ |
Testes | suíte de testes pytest |
alembic/ |
Migração de Banco de Dados | Scripts de Migração Alembic |
docker/ |
Configuração de Contêiner | Dockerfile + Compose |
(1) ▶ Exemplo: Criando o Esqueleto do Projeto
# Criar todos os diretórios
mkdir -p app/api/routes app/models app/schemas app/services app/core
mkdir -p tests alembic docker
# Criar arquivos __init__.py
touch app/__init__.py app/api/__init__.py app/api/routes/__init__.py
touch app/models/__init__.py app/schemas/__init__.py
touch app/services/__init__.py app/core/__init__.py
touch tests/__init__.py
Saída:
CONTAINER ID IMAGE STATUS
abc123 latest Up 2 hours
(2) ▶ Exemplo: Aplicação FastAPI Mínima app/main.py
from fastapi import FastAPI
app = FastAPI(
title="PriceTracker API",
description="Serviço SaaS de rastreamento de preços para e-commerce",
version="0.1.0",
)
@app.get("/health")
async def health_check():
return {"status": "healthy", "service": "pricetracker"}
Saída:
# Função definida com sucesso
5. Servidor de Desenvolvimento Uvicorn
(1) Parâmetros Chave do Uvicorn
| Parâmetro | Valor Padrão | Descrição |
|---|---|---|
--host |
127.0.0.1 |
Endereço de escuta; 0.0.0.0 permite acesso externo |
--port |
8000 |
Porta de Escuta |
--reload |
False |
Reinicialização automática ao alterar arquivos (apenas para desenvolvimento) |
--reload-dir |
. |
Diretórios a monitorar; múltiplas entradas permitidas |
--workers |
1 |
Número de processos worker (para produção; conflita com --reload) |
--log-level |
info |
Nível de Log |
(1) ▶ Exemplo: Iniciando em Modo de Desenvolvimento
# Iniciar com hot reload - reinicialização automática ao alterar código
uv run uvicorn app.main:app --reload --host 0.0.0.0 --port 8000
Saída:
INFO: Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)
INFO: Started reloader process
INFO: Started server process
INFO: Waiting for application startup.
INFO: Application startup complete.
(2) ▶ Exemplo: Iniciando em Modo de Produção
# Produção: múltiplos workers, sem reload
uv run uvicorn app.main:app --host 0.0.0.0 --port 8000 --workers 4
Saída:
# Comando executado com sucesso
(2) Comparação das Configurações do Uvicorn para Desenvolvimento vs. Produção
| Configuração | Ambiente de Desenvolvimento | Ambiente de Produção |
|---|---|---|
--reload |
Ligado | Desligado |
--workers |
1 | Número de núcleos de CPU x 2 + 1 |
--host |
127.0.0.1 | 0.0.0.0 |
--log-level |
debug | info/warning |
| Proxy frontend | Nenhum | Nginx/Traefik |
6. Gerenciamento de Variáveis de Ambiente
(1) O Arquivo .env e python-dotenv
Variáveis de ambiente são um princípio central do 12-Factor App; configurações sensíveis (como senhas de banco de dados e chaves JWT) nunca devem ser hard-coded.
(1) ▶ Exemplo: Criando um arquivo .env
# .env - NUNCA commite este arquivo no git!
APP_NAME=PriceTracker
DEBUG=true
DATABASE_URL=postgresql+asyncpg://pricetracker:secret@localhost:5432/pricetracker
REDIS_URL=redis://localhost:6379/0
SECRET_KEY=your-super-secret-key-change-in-production
ALGORITHM=HS256
ACCESS_TOKEN_EXPIRE_MINUTES=30
Saída:
// Execução Bem-Sucedida
(2) ▶ Exemplo: Pydantic Settings Lendo Variáveis de Ambiente
# app/core/config.py
from pydantic_settings import BaseSettings
class Settings(BaseSettings):
app_name: str = "PriceTracker"
debug: bool = False
database_url: str = "postgresql+asyncpg://localhost/pricetracker"
redis_url: str = "redis://localhost:6379/0"
secret_key: str = "change-me-in-production"
algorithm: str = "HS256"
access_token_expire_minutes: int = 30
model_config = {"env_file": ".env", "env_file_encoding": "utf-8"}
settings = Settings()
Saída:
# Execução Bem-Sucedida
(3) ▶ Exemplo: Usando Configuração no FastAPI
# app/main.py
from fastapi import FastAPI
from app.core.config import settings
app = FastAPI(
title=settings.app_name,
debug=settings.debug,
)
@app.get("/info")
async def app_info():
return {
"app": settings.app_name,
"debug": settings.debug,
"database": settings.database_url.split("@")[-1], # Ocultar credenciais
}
Saída:
# Função definida com sucesso
(2) Itens Essenciais para .gitignore
# Adicionar ao .gitignore
.env
.env.local
.env.production
.venv/
__pycache__/
*.pyc
| Documento | Commitado | Motivo |
|---|---|---|
.env |
Não | Contém informações sensíveis |
.env.example |
Sim | Modelo de Referência para a Equipe |
uv.lock |
Sim | Travamento de versões de dependência |
pyproject.toml |
Sim | Configuração do Projeto |
7. Exemplo Abrangente
Combinando gerenciamento de pacotes UV, configuração Pydantic Settings e inicialização Uvicorn, este guia demonstra o processo completo da inicialização do projeto ao deploy do serviço.
# dependências pyproject.toml: fastapi, uvicorn, pydantic-settings
from fastapi import FastAPI
from pydantic_settings import BaseSettings
class Settings(BaseSettings):
app_name: str = "PriceTracker"
debug: bool = False
database_url: str = "postgresql+asyncpg://user:pass@localhost/pricetracker"
model_config = {"env_file": ".env"}
settings = Settings()
app = FastAPI(title=settings.app_name, debug=settings.debug)
@app.get("/health")
async def health():
return {"status": "ok", "app": settings.app_name}
@app.get("/info")
async def info():
return {"app": settings.app_name, "debug": settings.debug}
# Iniciar: uv run uvicorn app.main:app --reload
Saída:
GET /health → {"status":"ok","app":"PriceTracker"}
GET /info → {"app":"PriceTracker","debug":false}
❓ Perguntas Frequentes
uv.lock e ambientes virtuais; usar pip junto pode causar conflitos de dependência. Mantenha o fluxo de trabalho uv add/uv run.powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex".📖 Resumo
- UV é escrito em Rust; instala dependências 10 a 100 vezes mais rápido que pip e inclui ambientes virtuais integrados e gerenciamento de versão do Python.
- O projeto PriceTracker usa uma arquitetura em camadas consistindo de cinco camadas: api/routes, models, schemas, services e core
- Uvicorn usa
--reloadpara hot reloading em desenvolvimento e--workerspara operação multi-processo em produção .env+ Pydantic Settings: Gerencie variáveis de ambiente; nunca hard-code configurações sensíveisuv run uvicorn app.main:app --reloadInicie um ambiente de desenvolvimento completo com um único comando
📝 Exercícios
- Exercício Básico (Dificuldade ⭐): Crie um projeto usando
uv init, adicione as dependências FastAPI e Uvicorn, e execute seu primeiro endpoint "Hello World". Dica:uv add fastapi uvicorn - Exercício Avançado (Dificuldade: ⭐⭐): Crie a estrutura de diretórios do projeto PriceTracker, escreva o endpoint
app/main.pyque inclui o endpoint/health, e useuv run uvicornpara iniciar e verificar. Dica: Consulte o diagrama de estrutura de diretórios neste artigo. - Desafio (Dificuldade: ⭐⭐⭐): Use Pydantic Settings para criar uma classe de configuração que leia arquivos do arquivo
.env, leiaDATABASE_URLeSECRET_KEY, e retorne o nome da aplicação no endpoint/info(sem expor o segredo). Dica:pip install pydantic-settings, ou seja,uv add pydantic-settings
---|



