对财务管理小程序main.py的理解

目录

一、导入模块和库

二、自定义Swagger UI和ReDoc

三、创建FastAPI应用

四、异常处理

五、CORS中间件

六、路由导入

七、根路由

八、数据库初始化

九、启动服务器

十、总结


        本部分代码是使用FastAPI框架和Tortoise-ORM构建的一个后端服务示例,主要用于支持财务管理小程序的后台功能。以下是对代码主要部分的总结:

一、导入模块和库

from fastapi import FastAPI, Request, applications, status
from fastapi.openapi.docs import get_swagger_ui_html, get_redoc_html
from fastapi.exceptions import RequestValidationError
from fastapi.responses import JSONResponse
from tortoise import Tortoise, run_async
from fastapi.middleware.cors import CORSMiddleware
import uvicorn
import nest_asyncio
nest_asyncio.apply()  #异步操作

# 导入数据API
from app.api.mb import asset, category, bill, stat, preorder

       这一部分代码是FastAPI Web服务的一部分,它主要负责导入必要的库、模块和初始化一些基础设置。下面是对这些导入语句的详细解释:

  1. 导入FastAPI相关
    • from fastapi import FastAPI, Request, applications, status
      • FastAPI:从fastapi包中导入FastAPI类,用于创建FastAPI应用实例。
      • Request:从fastapi包中导入Request类,用于在路由处理函数中获取HTTP请求对象。不过,在大多数情况下,FastAPI的路由处理函数会直接通过参数接收请求对象,因此这里的Request导入可能不是必需的,除非在特定的场景下有特殊用途。
      • applications:这个导入似乎是不必要的,因为FastAPI应用通常不会直接通过applications模块来访问。可能是一个遗留的导入或者误操作。
      • status:从fastapi包中导入status模块,该模块包含了一系列HTTP状态码常量,如status.HTTP_200_OKstatus.HTTP_404_NOT_FOUND等,用于在响应中设置状态码。
  2. 导入文档生成相关
    • from fastapi.openapi.docs import get_swagger_ui_html, get_redoc_html
      • get_swagger_ui_html:一个函数,用于生成Swagger UI的HTML页面,用户可以通过这个页面查看API的文档。
      • get_redoc_html:一个函数,用于生成ReDoc的HTML页面,ReDoc是另一个流行的API文档工具,它提供了与Swagger UI不同的视觉样式和功能。
  3. 导入异常处理相关
    • from fastapi.exceptions import RequestValidationError
      • RequestValidationError:从fastapi.exceptions中导入RequestValidationError异常类。这个异常在FastAPI中自动抛出,当请求数据无法通过Pydantic模型验证时。可以通过定义异常处理器来捕获这个异常,并返回自定义的错误响应。
  4. 导入响应相关
    • from fastapi.responses import JSONResponse
      • JSONResponse:从fastapi.responses中导入JSONResponse类。这个类用于创建JSON格式的响应对象。虽然FastAPI会自动将返回的字典、列表等转换为JSON格式,但在某些情况下,你可能需要直接创建JSONResponse对象以自定义响应的某些方面(如状态码、头部信息等)。
  5. 导入Tortoise ORM相关
    • from tortoise import Tortoise, run_async
      • Tortoise:Tortoise ORM的主类,用于执行ORM相关的操作,如初始化数据库连接、生成数据库模式等。
      • run_async:Tortoise ORM提供的一个辅助函数,用于运行简单的异步脚本。在这个示例中,它被用来运行异步的数据库初始化函数。
  6. 导入CORS中间件
    • from fastapi.middleware.cors import CORSMiddleware
      • CORSMiddleware:从fastapi.middleware.cors中导入CORS中间件。这个中间件用于处理跨源资源共享(CORS)请求,允许来自不同源的Web应用访问你的API。
  7. 导入其他库
    • import uvicorn:导入uvicorn库,它是一个轻量级的ASGI服务器,用于运行FastAPI应用。
    • import nest_asyncio:导入nest_asyncio库,这个库允许在异步函数中嵌套异步调用,这在某些情况下(如在使用Jupyter Notebook时)是必要的。
    • nest_asyncio.apply():调用nest_asyncio.apply()函数以启用异步嵌套支持。
  8. 导入数据API
    • from app.api.mb import asset, category, bill, stat, preorder
      • app.api.mb模块中导入不同的子应用(或称为API模块),这些子应用通常包含FastAPI的路由定义和与这些路由相关的业务逻辑。在这个示例中,assetcategorybillstatpreorder可能是代表不同业务领域的API模块,如资产管理、分类管理、账单管理、统计管理、预订单管理等。通过app.include_router(...),这些子应用的路由将被包含到主FastAPI应用中。

二、自定义Swagger UI和ReDoc

def swagger_monkey_patch(*args, **kwargs):  
    # ...  
applications.get_swagger_ui_html = swagger_monkey_patch  
  
def redoc_monkey_patch(*args, **kwargs):  
    # ...  
applications.get_redoc_html = redoc_monkey_patch
  • 这两段代码通过“猴子补丁”的方式自定义了FastAPI生成的Swagger UI和ReDoc文档的JS和CSS资源链接。这是通过覆盖applications模块中的get_swagger_ui_htmlget_redoc_html函数来实现的。
  • 在这些自定义函数中,指定了CDN提供的Swagger UI和ReDoc的JS和CSS文件URL,以确保文档界面使用最新版本的样式和脚本。

三、创建FastAPI应用

app = FastAPI(title="XBill",  
              description="天天账本小程序后台服务",  
              docs_url="/docs",  
              openapi_url="/openapi")
  • 这行代码创建了一个FastAPI应用实例,并设置了应用的标题、描述、文档URL和OpenAPI规范URL。
  • 标题设置为“XBill”,描述为“天天账本小程序后台服务”,文档URL为/docs,OpenAPI规范URL为/openapi

四、异常处理

@app.exception_handler(RequestValidationError)  
async def validation_exception_handler(request: Request, exc: RequestValidationError):  
    # ...
  • 这部分代码定义了一个异常处理器,用于捕获并处理RequestValidationError异常。
  • 当请求验证失败时,该处理器会生成一个自定义的JSON响应,其中包含错误信息的简洁表示,并通过打印语句将错误信息输出到控制台。

五、CORS中间件

app.add_middleware(  
    CORSMiddleware,  
    allow_origins=['*'],      
    allow_credentials=True,  
    allow_methods=["*"],  
    allow_headers=["*"],  
)
  • 这行代码向FastAPI应用添加了一个CORS中间件,以支持跨域资源共享。
  • 它允许所有源('*')进行跨域请求,并允许携带凭证、所有HTTP方法和所有头部。

六、路由导入

app.include_router(asset.router)  
app.include_router(category.router)  
app.include_router(bill.router)  
app.include_router(stat.router)  
app.include_router(preorder.router)
  • 这些代码行将不同业务模块的路由处理器添加到主FastAPI应用中。
  • 每个模块(如assetcategorybillstatpreorder)都定义了自己的路由和处理器,通过include_router方法将它们集成到主应用中。

七、根路由

@app.get("/",include_in_schema=False)  
async def root():  
    return { "message": "Hello Bigger Applications!" }
  • 这部分代码定义了一个根路由/,当访问该URL时,将返回一个包含简单消息的JSON对象。
  • 通过设置include_in_schema=False,该路由被排除在OpenAPI/Swagger文档中。

八、数据库初始化

async def init():  
    # ...  
run_async(init())
  • 这部分代码定义了一个异步函数init,用于初始化Tortoise ORM并连接到数据库,然后生成数据库表结构。
  • 使用run_async函数以异步方式运行init函数,以确保数据库在应用启动之前被正确初始化。

九、启动服务器

if __name__=='__main__':  
    uvicorn.run(app='main:app',host='0.0.0.0',port=8000,reload=True)
  • 这段代码是程序的入口点,当脚本作为主程序运行时执行。
  • 它使用uvicorn.run函数启动ASGI服务器,指定主模块为main:app(假设当前脚本名为main.py),监听所有地址(0.0.0.0)的8000端口,并启用代码热重载。

十、总结

      这段代码展示了如何使用FastAPI和Tortoise-ORM构建一个包含异常处理、CORS支持、数据库初始化和文档生成(Swagger UI和ReDoc)的完整后端服务。通过模块化设计,将不同的业务逻辑分散到不同的模块中,提高了代码的可维护性和可扩展性。同时,通过异步操作和数据库ORM的使用,优化了应用的性能和开发效率。 

你可能感兴趣的:(小程序)