from flask import Flask from flask_bootstrap import Bootstrap5 from flask_mail import Mail from flask_login import LoginManager from flask_wtf.csrf import CSRFProtect from dotenv import load_dotenv import os import secrets import logging # Importações de configurações from models.entities.base import Base, engine from routes.main import main_bp from routes.admin import admin_bp from routes.auth import auth_bp from routes.militante import militante_bp from routes.pagamento import pagamento_bp from routes.relatorio import relatorio_bp from routes.cota import cota_bp # Configuração do logger logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) # Carregar variáveis de ambiente load_dotenv() def create_app(): """Factory para criação da aplicação Flask""" app = Flask(__name__) # Configuração secreta app.secret_key = os.getenv('SECRET_KEY', secrets.token_hex(16)) # Configuração de Bootstrap bootstrap = Bootstrap5(app) # Registrar blueprints app.register_blueprint(main_bp) app.register_blueprint(admin_bp) app.register_blueprint(auth_bp) app.register_blueprint(militante_bp) app.register_blueprint(pagamento_bp) app.register_blueprint(relatorio_bp) app.register_blueprint(cota_bp) # Configurar proteção CSRF csrf = CSRFProtect() csrf.init_app(app) app.config['WTF_CSRF_CHECK_DEFAULT'] = False app.config['WTF_CSRF_HEADERS'] = ['X-CSRFToken'] # Configurar Flask-Login login_manager = LoginManager() login_manager.init_app(app) login_manager.login_view = 'auth.login' # Função para carregar usuário no login_manager from models.entities.usuario import Usuario from services.database_service import DatabaseService from sqlalchemy.orm import joinedload @login_manager.user_loader def load_user(user_id): """Carrega o usuário pelo ID""" db = DatabaseService.get_db_connection() try: user = db.query(Usuario).options( joinedload(Usuario.roles) ).get(user_id) return user finally: db.close() # Adicionar filtros Jinja2 @app.template_filter('bitwise_and') def bitwise_and(value1, value2): """Filtro para operação bit a bit AND""" return value1 & value2 # Configurar Flask-Mail app.config['MAIL_SERVER'] = os.getenv('MAIL_SERVER', 'smtp.gmail.com') app.config['MAIL_PORT'] = int(os.getenv('MAIL_PORT', 587)) app.config['MAIL_USE_TLS'] = os.getenv('MAIL_USE_TLS', 'True').lower() == 'true' app.config['MAIL_USERNAME'] = os.getenv('MAIL_USERNAME') app.config['MAIL_PASSWORD'] = os.getenv('MAIL_PASSWORD') app.config['MAIL_DEFAULT_SENDER'] = os.getenv('MAIL_DEFAULT_SENDER') # Inicializar Mail mail = Mail(app) return app def init_system(): """Inicializa o sistema com banco de dados e usuários padrão""" from functions.database import init_database # Inicializar banco de dados logger.info("Inicializando banco de dados...") init_database() # Outros procedimentos de inicialização podem ser adicionados aqui def main(): """Inicializa e retorna a aplicação Flask""" return create_app() # Criar a aplicação app = main() if __name__ == '__main__': import sys # Verificar se é para inicializar o sistema if '--init' in sys.argv: init_system() else: # Executar a aplicação app.run( host='0.0.0.0', port=5000, debug=os.getenv('FLASK_ENV') == 'development' )