-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathauto_app.py
More file actions
146 lines (113 loc) · 4.91 KB
/
auto_app.py
File metadata and controls
146 lines (113 loc) · 4.91 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
import logging
import logging.config
from typing import Optional, Any
import yaml
from asgi_correlation_id import CorrelationIdMiddleware
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from fastapi.responses import ORJSONResponse
from starlette.middleware.authentication import AuthenticationMiddleware
from utilswaves.common import register_exception_handler
from utilswaves.dependencies import get_correlation_id
from utilswaves.lifespan_manager import LifespanManager
from utilswaves.middlewares import HermesAlertMiddleware, AccessLoggerMiddleware
from utilswaves.middlewares.access_monitor_middleware import AccessMonitorMiddleware
from utilswaves.schema import NAMESPACE
from api import api
from app.config import Settings, BASEDIR
# from app.core.client.redis import redis_client
from app.core.middleware.auth import AuthBackend, on_auth_error
logger = logging.getLogger(__name__)
_app: Optional[FastAPI] = None
def create_app(app_settings: Settings, lifespan_manager: LifespanManager = None, **kwargs):
global _app
if _app:
return _app
initial_logger(app_settings)
logger.info("Create Application ...")
logger.info(f"NAMESPACE: {app_settings.namespace}")
logger.debug(f"Settings: {app_settings}")
lifespan_manager = lifespan_manager or LifespanManager()
app_params = setting_params(app_settings, kwargs)
app = FastAPI(**app_params, lifespan=lifespan_manager, default_response_class=ORJSONResponse)
# # 注册中间件
register_middleware(app, app_settings)
# 注册异常处理器
logger.info("Register Exception Handler")
register_exception_handler(app)
# 注册外部服务
# register_client(app_settings)
# registry routers
register_router(app)
_app = app
return _app
def initial_logger(app_settings):
with open(BASEDIR.joinpath("configs/log_config.yaml")) as f:
config = yaml.safe_load(f.read())
logging.config.dictConfig(config)
if app_settings.app.debug:
logging.getLogger("root").setLevel(logging.DEBUG)
def setting_params(app_settings: Settings, params: Optional[dict]) -> dict[str, Any]:
params = params or {}
params.setdefault("title", app_settings.app_name)
params.setdefault("version", app_settings.version)
description = f"""
NAMESPACE: **{app_settings.namespace.upper()}**
"""
logger.info(f"setting_params {app_settings=}")
params.setdefault("description", description)
match app_settings.namespace:
case NAMESPACE.LOCAL:
params.setdefault("debug", app_settings.app.debug)
case NAMESPACE.DEV:
logger.info("setting_params root")
params.setdefault("root_path", "/dev/kuka/")
case NAMESPACE.PROD:
params.setdefault("docs_url", None)
params.setdefault("redoc_url", None)
params.setdefault("openapi_url", None)
return params
def register_middleware(app: FastAPI, app_settings: Settings):
app.add_middleware(
AuthenticationMiddleware,
backend=AuthBackend(exclude=["POST-/login", "GET-/docs", "GET-/openapi.json", "GET-/metrics"]),
on_error=on_auth_error,
)
logger.info("Register HermesAlert Middleware")
if app_settings.namespace != NAMESPACE.LOCAL:
logger.info("Register HermesAlert Middleware")
app.add_middleware(
HermesAlertMiddleware,
app_name=app_settings.app_name,
namespace=app_settings.namespace,
**app_settings.hermes.model_dump(),
)
# generate request_id
logger.info("Register CorrelationId Middleware")
app.add_middleware(CorrelationIdMiddleware)
logger.info("Register Access Middleware")
# start with uvicorn, uvicorn.access format cant change
_logger = (
logging.getLogger("uvicorn.access") if app_settings.namespace not in [NAMESPACE.LOCAL, NAMESPACE.TEST] else None
)
app.add_middleware(AccessLoggerMiddleware, logger=_logger, request_id_factory=get_correlation_id)
app.add_middleware(AccessMonitorMiddleware)
logger.info("Register CORS Middleware")
app.add_middleware(
CORSMiddleware,
allow_origins=["*"], # 允许的域名列表
allow_credentials=True, # 允许在跨域请求中使用凭证(如Cookie)
allow_methods=["*"], # 允许的请求方法列表,这里使用通配符表示支持所有方法
allow_headers=["*"], # 允许的请求头列表,这里使用通配符表示支持所有头部字段
# Indicate which headers can be exposed as part of the response to a browser
expose_headers=["X-Request-Id", "X-Model-Type"],
)
# def register_client(app_settings: Settings):
# redis_client.configure(
# app_settings.redis.url,
# prefix=f"{app_settings.app_name}:{app_settings.namespace}",
# )
def register_databases(lifespan_manager, app_settings: Settings):
pass
def register_router(app):
app.include_router(api.router)