Ajuste cors

This commit is contained in:
Kenio 2025-10-15 16:53:00 -03:00
parent de70b15bdb
commit 540d11899e

95
main.py
View file

@ -6,32 +6,63 @@ import sys
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
# Importa a classe principal do FastAPI # Importa a classe principal do FastAPI
from fastapi import FastAPI, Request from fastapi import FastAPI, Request, Response
from pathlib import Path from pathlib import Path
# Importa o middleware de CORS # Importa o middleware de CORS
from fastapi.middleware.cors import CORSMiddleware 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 # Importa o roteador principal da API versão 1
from packages.v1.api import api_router from packages.v1.api import api_router
from packages.v1.system.service.startup_check_service import \ from packages.v1.system.service.startup_check_service import StartupCheckService
StartupCheckService
# Importa as configurações globais da aplicação # Importa as configurações globais da aplicação
from actions.log.log import Log from actions.log.log import Log
from actions.config.config import Config from actions.config.config import Config
from actions.system.handlers import register_exception_handlers from actions.system.handlers import register_exception_handlers
# Carrega as configurações do app
config = Config.get('app.json') config = Config.get('app.json')
# Instancia o app FastAPI com um título personalizado # Instancia o app FastAPI com um título personalizado
app = FastAPI(title='Monitoramento Orius') app = FastAPI(title='Monitoramento Orius')
# Controle de erros personalizados # Registra o controle de erros personalizados
register_exception_handlers(app) 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( app.add_middleware(
CORSMiddleware, CORSMiddleware,
allow_origins=[ allow_origins=[
@ -44,44 +75,34 @@ app.add_middleware(
allow_headers=["*"], 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") @app.on_event("startup")
async def on_startup(): async def on_startup():
# Realiza as verificações do servidor # Realiza as verificações do servidor
startupCheckService = StartupCheckService() startupCheckService = StartupCheckService()
# Exibe o amarzenamento do servidor
print(startupCheckService.execute()) print(startupCheckService.execute())
@app.middleware("http") # ---------------------------------------------------------------------------
async def log_tempo_requisicao(request: Request, call_next): # ROTAS PRINCIPAIS DA API
# ---------------------------------------------------------------------------
# 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)
app.include_router(api_router, prefix=config.url) 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__': if __name__ == '__main__':
import uvicorn import uvicorn
uvicorn.run( uvicorn.run(