123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163 |
- #!/usr/bin/env python3
- # -*- coding: utf-8 -*-
- from contextlib import asynccontextmanager
- from fastapi import Depends, FastAPI
- from fastapi_limiter import FastAPILimiter
- from fastapi_pagination import add_pagination
- from starlette.middleware.authentication import AuthenticationMiddleware
- from app.router import route
- from common.exception.exception_handler import register_exception
- from common.log import set_customize_logfile, setup_logging
- from core.conf import settings
- from core.path_conf import STATIC_DIR
- from database.db_mysql import create_table
- from database.db_redis import redis_client
- from middleware.opera_log_middleware import OperaLogMiddleware
- from utils.demo_site import demo_site
- from utils.health_check import ensure_unique_route_names, http_limit_callback
- from utils.openapi import simplify_operation_ids
- from utils.serializers import MsgSpecJSONResponse
- @asynccontextmanager
- async def register_init(app: FastAPI):
- """
- 启动初始化
- :return:
- """
- # 创建数据库表
- # await create_table()
- # 连接 redis
- await redis_client.open()
- # 初始化 limiter
- await FastAPILimiter.init(redis_client, prefix=settings.LIMITER_REDIS_PREFIX, http_callback=http_limit_callback)
- yield
- # 关闭 redis 连接
- await redis_client.close()
- # 关闭 limiter
- await FastAPILimiter.close()
- def register_app():
- # FastAPI
- app = FastAPI(
- title=settings.TITLE,
- version=settings.VERSION,
- description=settings.DESCRIPTION,
- docs_url=settings.DOCS_URL,
- redoc_url=settings.REDOCS_URL,
- openapi_url=settings.OPENAPI_URL,
- default_response_class=MsgSpecJSONResponse,
- lifespan=register_init,
- )
- # 日志
- register_logger()
- # 静态文件
- register_static_file(app)
- # 中间件
- register_middleware(app)
- # 路由
- register_router(app)
- # 分页
- register_page(app)
- # 全局异常处理
- register_exception(app)
- return app
- def register_logger() -> None:
- """
- 系统日志
- :return:
- """
- setup_logging()
- set_customize_logfile()
- def register_static_file(app: FastAPI):
- """
- 静态文件交互开发模式, 生产使用 nginx 静态资源服务
- :param app:
- :return:
- """
- if settings.STATIC_FILES:
- import os
- from fastapi.staticfiles import StaticFiles
- if not os.path.exists(STATIC_DIR):
- os.mkdir(STATIC_DIR)
- app.mount('/static', StaticFiles(directory=STATIC_DIR), name='static')
- def register_middleware(app: FastAPI):
- """
- 中间件,执行顺序从下往上
- :param app:
- :return:
- """
- # Opera log
- # app.add_middleware(OperaLogMiddleware)
- # JWT auth, required
- # app.add_middleware(
- # AuthenticationMiddleware, backend=JwtAuthMiddleware(), on_error=JwtAuthMiddleware.auth_exception_handler
- # )
- # Access log
- if settings.MIDDLEWARE_ACCESS:
- from middleware.access_middleware import AccessMiddleware
- app.add_middleware(AccessMiddleware)
- # CORS: Always at the end
- if settings.MIDDLEWARE_CORS:
- from fastapi.middleware.cors import CORSMiddleware
- app.add_middleware(
- CORSMiddleware,
- allow_origins=['*'],
- allow_credentials=True,
- allow_methods=['*'],
- allow_headers=['*'],
- )
- def register_router(app: FastAPI):
- """
- 路由
- :param app: FastAPI
- :return:
- """
- dependencies = [Depends(demo_site)] if settings.DEMO_MODE else None
- # API
- app.include_router(route, dependencies=dependencies)
- # Extra
- ensure_unique_route_names(app)
- simplify_operation_ids(app)
- def register_page(app: FastAPI):
- """
- 分页查询
- :param app:
- :return:
- """
- add_pagination(app)
|