1. Estrutura do Projeto
O repositório YTU-CE é organizado para separar a aplicação, configurações, infraestrutura e scripts auxiliares. Abaixo está uma visão geral das pastas e arquivos principais:
YTU-CE/
├── .dockerignore
├── .env.example
├── docker-compose.yml
├── manage.py
├── pyproject.toml
├── src/
│ ├── __init__.py
│ ├── extensions.py
│ ├── blueprints/
│ │ ├── __init__.py
│ │ ├── routes.py
│ │ └── schemas.py
│ ├── services/
│ │ └── core.py
│ ├── static/
│ └── templates/
├── tests/
│ └── conftest.py
└── config/
├── __init__.py
├── base.py
└── production.py
.dockerignore: indica arquivos que não devem entrar na imagem Docker..env.example: modelo de variáveis de ambiente.docker-compose.yml: orquestração dos serviços da aplicação.manage.py: ponto de entrada da aplicação.pyproject.toml: metadados e dependências do projeto.src/: código-fonte principal.extensions.py: inicialização de extensões como benco de dados e cache.blueprints/: rotas e esquemas organizados em módulos.services/: lógica de negócio reutilizável.static/etemplates/: recursos estáticos e templates HTML.
tests/: conjunto de testes com fixtures.config/: módulos de configuração por ambiente.
2. Arquivo de Inicialização
O arquivo manage.py cria a aplicação por meio de uma factory function e inicia o servidor local:
import os
from src import create_app
settings_module = os.getenv('FLASK_ENV', 'config.base')
if __name__ == '__main__':
app = create_app(settings_module)
app.run(
host=app.config.get('HOST', '127.0.0.1'),
port=app.config.get('PORT', 5000),
debug=app.config.get('DEBUG', False)
)
Esse padrão separa a criação da aplicação da sua execução, facilitando testes e reutilização da instância.
3. Configuração por Ambiente
A pasta config/ utiliza herança para isolar regras de desenvolvimento, testes e produção. O exemplo abaixo mostra a configuração base e uma especialização para produção:
# config/base.py
import os
class BaseConfig:
SECRET_KEY = os.environ.get('SECRET_KEY', 'chave-padrao')
DEBUG = False
TESTING = False
SQLALCHEMY_DATABASE_URI = os.environ.get(
'DATABASE_URL', 'postgresql://localhost:5432/ytuce'
)
SQLALCHEMY_TRACK_MODIFICATIONS = False
# config/production.py
import os
from config.base import BaseConfig
class ProdConfig(BaseConfig):
DEBUG = False
SQLALCHEMY_ENGINE_OPTIONS = {
'pool_size': int(os.environ.get('DB_POOL_SIZE', 10)),
'max_overflow': int(os.environ.get('DB_MAX_OVERFLOW', 20))
}
Para ativar a configuração correta, defina a variável de ambiente correspondente:
export FLASK_ENV=config.production.ProdConfig
python manage.py