Ajuste cors
This commit is contained in:
parent
de70b15bdb
commit
540d11899e
1 changed files with 59 additions and 38 deletions
95
main.py
95
main.py
|
|
@ -6,32 +6,63 @@ 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=[
|
||||
|
|
@ -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(
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue