registrar.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. from contextlib import asynccontextmanager
  4. from fastapi import Depends, FastAPI
  5. from fastapi_limiter import FastAPILimiter
  6. from fastapi_pagination import add_pagination
  7. from starlette.middleware.authentication import AuthenticationMiddleware
  8. from app.router import route
  9. from common.exception.exception_handler import register_exception
  10. from common.log import set_customize_logfile, setup_logging
  11. from core.conf import settings
  12. from core.path_conf import STATIC_DIR
  13. from database.db_mysql import create_table
  14. from database.db_redis import redis_client
  15. from middleware.opera_log_middleware import OperaLogMiddleware
  16. from utils.demo_site import demo_site
  17. from utils.health_check import ensure_unique_route_names, http_limit_callback
  18. from utils.openapi import simplify_operation_ids
  19. from utils.serializers import MsgSpecJSONResponse
  20. @asynccontextmanager
  21. async def register_init(app: FastAPI):
  22. """
  23. 启动初始化
  24. :return:
  25. """
  26. # 创建数据库表
  27. # await create_table()
  28. # 连接 redis
  29. await redis_client.open()
  30. # 初始化 limiter
  31. await FastAPILimiter.init(redis_client, prefix=settings.LIMITER_REDIS_PREFIX, http_callback=http_limit_callback)
  32. yield
  33. # 关闭 redis 连接
  34. await redis_client.close()
  35. # 关闭 limiter
  36. await FastAPILimiter.close()
  37. def register_app():
  38. # FastAPI
  39. app = FastAPI(
  40. title=settings.TITLE,
  41. version=settings.VERSION,
  42. description=settings.DESCRIPTION,
  43. docs_url=settings.DOCS_URL,
  44. redoc_url=settings.REDOCS_URL,
  45. openapi_url=settings.OPENAPI_URL,
  46. default_response_class=MsgSpecJSONResponse,
  47. lifespan=register_init,
  48. )
  49. # 日志
  50. register_logger()
  51. # 静态文件
  52. register_static_file(app)
  53. # 中间件
  54. register_middleware(app)
  55. # 路由
  56. register_router(app)
  57. # 分页
  58. register_page(app)
  59. # 全局异常处理
  60. register_exception(app)
  61. return app
  62. def register_logger() -> None:
  63. """
  64. 系统日志
  65. :return:
  66. """
  67. setup_logging()
  68. set_customize_logfile()
  69. def register_static_file(app: FastAPI):
  70. """
  71. 静态文件交互开发模式, 生产使用 nginx 静态资源服务
  72. :param app:
  73. :return:
  74. """
  75. if settings.STATIC_FILES:
  76. import os
  77. from fastapi.staticfiles import StaticFiles
  78. if not os.path.exists(STATIC_DIR):
  79. os.mkdir(STATIC_DIR)
  80. app.mount('/static', StaticFiles(directory=STATIC_DIR), name='static')
  81. def register_middleware(app: FastAPI):
  82. """
  83. 中间件,执行顺序从下往上
  84. :param app:
  85. :return:
  86. """
  87. # Opera log
  88. # app.add_middleware(OperaLogMiddleware)
  89. # JWT auth, required
  90. # app.add_middleware(
  91. # AuthenticationMiddleware, backend=JwtAuthMiddleware(), on_error=JwtAuthMiddleware.auth_exception_handler
  92. # )
  93. # Access log
  94. if settings.MIDDLEWARE_ACCESS:
  95. from middleware.access_middleware import AccessMiddleware
  96. app.add_middleware(AccessMiddleware)
  97. # CORS: Always at the end
  98. if settings.MIDDLEWARE_CORS:
  99. from fastapi.middleware.cors import CORSMiddleware
  100. app.add_middleware(
  101. CORSMiddleware,
  102. allow_origins=['*'],
  103. allow_credentials=True,
  104. allow_methods=['*'],
  105. allow_headers=['*'],
  106. )
  107. def register_router(app: FastAPI):
  108. """
  109. 路由
  110. :param app: FastAPI
  111. :return:
  112. """
  113. dependencies = [Depends(demo_site)] if settings.DEMO_MODE else None
  114. # API
  115. app.include_router(route, dependencies=dependencies)
  116. # Extra
  117. ensure_unique_route_names(app)
  118. simplify_operation_ids(app)
  119. def register_page(app: FastAPI):
  120. """
  121. 分页查询
  122. :param app:
  123. :return:
  124. """
  125. add_pagination(app)