From 540d11899e196776399de7de08c1a561f6373219 Mon Sep 17 00:00:00 2001 From: Kenio de Souza Date: Wed, 15 Oct 2025 16:53:00 -0300 Subject: [PATCH] Ajuste cors --- main.py | 97 +++++++++++++++++++++++++++++++++++---------------------- 1 file changed, 59 insertions(+), 38 deletions(-) diff --git a/main.py b/main.py index f8d5139..242d6f5 100644 --- a/main.py +++ b/main.py @@ -6,36 +6,67 @@ import sys sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) # Importa a classe principal do FastAPI -from fastapi import FastAPI, Request +from fastapi import FastAPI, Request, Response from pathlib import Path + # Importa o middleware de CORS from fastapi.middleware.cors import CORSMiddleware -from fastapi.responses import Response -from starlette.middleware.base import BaseHTTPMiddleware # Importa o roteador principal da API versão 1 from packages.v1.api import api_router -from packages.v1.system.service.startup_check_service import \ - StartupCheckService +from packages.v1.system.service.startup_check_service import StartupCheckService # Importa as configurações globais da aplicação from actions.log.log import Log from actions.config.config import Config from actions.system.handlers import register_exception_handlers +# Carrega as configurações do app config = Config.get('app.json') # Instancia o app FastAPI com um título personalizado app = FastAPI(title='Monitoramento Orius') -# Controle de erros personalizados +# Registra o controle de erros personalizados register_exception_handlers(app) -# Adiciona o middleware de CORS +# --------------------------------------------------------------------------- +# MIDDLEWARE DE LOG — DEVE VIR *ANTES* DO CORS, MAS NÃO INTERCEPTAR OPTIONS +# --------------------------------------------------------------------------- +@app.middleware("http") +async def log_tempo_requisicao(request: Request, call_next): + # Ignora requisições OPTIONS (preflight) + if request.method == "OPTIONS": + return Response(status_code=200) + + # Ação responsável por registrar o log de requisição + log = Log() + config = Config.get('app.json') + + # Obtém os dados da requisição + log_data = { + "method": request.method, + "url": str(request.url), + "headers": dict(request.headers) + } + + # Gera o nome do arquivo de log + file = Path(config.log.request.path) / config.log.request.name + + # Registra as requisições + log.register(log_data, file) + + # Passa adiante para o próximo middleware + response = await call_next(request) + return response + +# --------------------------------------------------------------------------- +# CORS — DEVE SER ADICIONADO *DEPOIS* DOS MIDDLEWARES CUSTOMIZADOS +# --------------------------------------------------------------------------- app.add_middleware( CORSMiddleware, allow_origins=[ - "http://localhost:3000", # ambiente local + "http://localhost:3000", # ambiente local "https://monitoring.oriustecnologia.com", # domínio de produção "https://painel.oriustecnologia.com", # se o painel consome essa API ], @@ -44,44 +75,34 @@ app.add_middleware( allow_headers=["*"], ) +# --------------------------------------------------------------------------- +# HANDLER OPCIONAL PARA GARANTIR QUE PRE-FLIGHT SEMPRE RESPONDA +# --------------------------------------------------------------------------- +@app.options("/{rest_of_path:path}") +async def preflight_handler(rest_of_path: str): + """ + Handler global para requisições OPTIONS (preflight CORS). + Garante que o navegador receba status 200 mesmo que a rota não exista. + """ + return Response(status_code=200) + +# --------------------------------------------------------------------------- +# EVENTOS DE STARTUP +# --------------------------------------------------------------------------- @app.on_event("startup") async def on_startup(): - # Realiza as verificações do servidor startupCheckService = StartupCheckService() - - # Exibe o amarzenamento do servidor print(startupCheckService.execute()) -@app.middleware("http") -async def log_tempo_requisicao(request: Request, call_next): - - # Ação responsavel por registrar o log de requisição - log = Log() - config = Config.get('app.json') - - # Obtem os dados da requisição - log_data = { - "method": request.method, - "url": str(request.url), - "headers": dict(request.headers) - } - - # Gera o nome do arquivo - file = Path(config.log.request.path) / config.log.request.name - - # Registra as requisições - log.register(log_data, file) - - # Passa adiante - response = await call_next(request) - - return response - -# Inclui as rotas da versão 1 da API com prefixo definido em settings (ex: /api/v1) +# --------------------------------------------------------------------------- +# ROTAS PRINCIPAIS DA API +# --------------------------------------------------------------------------- app.include_router(api_router, prefix=config.url) -# Executa o servidor com Uvicorn se este arquivo for executado diretamente +# --------------------------------------------------------------------------- +# EXECUÇÃO LOCAL DIRETA +# --------------------------------------------------------------------------- if __name__ == '__main__': import uvicorn uvicorn.run(