目录
一、导入模块和库
二、自定义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服务的一部分,它主要负责导入必要的库、模块和初始化一些基础设置。下面是对这些导入语句的详细解释:
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_OK
、status.HTTP_404_NOT_FOUND
等,用于在响应中设置状态码。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不同的视觉样式和功能。from fastapi.exceptions import RequestValidationError
RequestValidationError
:从fastapi.exceptions
中导入RequestValidationError
异常类。这个异常在FastAPI中自动抛出,当请求数据无法通过Pydantic模型验证时。可以通过定义异常处理器来捕获这个异常,并返回自定义的错误响应。from fastapi.responses import JSONResponse
JSONResponse
:从fastapi.responses
中导入JSONResponse
类。这个类用于创建JSON格式的响应对象。虽然FastAPI会自动将返回的字典、列表等转换为JSON格式,但在某些情况下,你可能需要直接创建JSONResponse
对象以自定义响应的某些方面(如状态码、头部信息等)。from tortoise import Tortoise, run_async
Tortoise
:Tortoise ORM的主类,用于执行ORM相关的操作,如初始化数据库连接、生成数据库模式等。run_async
:Tortoise ORM提供的一个辅助函数,用于运行简单的异步脚本。在这个示例中,它被用来运行异步的数据库初始化函数。from fastapi.middleware.cors import CORSMiddleware
CORSMiddleware
:从fastapi.middleware.cors
中导入CORS中间件。这个中间件用于处理跨源资源共享(CORS)请求,允许来自不同源的Web应用访问你的API。import uvicorn
:导入uvicorn
库,它是一个轻量级的ASGI服务器,用于运行FastAPI应用。import nest_asyncio
:导入nest_asyncio
库,这个库允许在异步函数中嵌套异步调用,这在某些情况下(如在使用Jupyter Notebook时)是必要的。nest_asyncio.apply()
:调用nest_asyncio.apply()
函数以启用异步嵌套支持。from app.api.mb import asset, category, bill, stat, preorder
app.api.mb
模块中导入不同的子应用(或称为API模块),这些子应用通常包含FastAPI的路由定义和与这些路由相关的业务逻辑。在这个示例中,asset
、category
、bill
、stat
、preorder
可能是代表不同业务领域的API模块,如资产管理、分类管理、账单管理、统计管理、预订单管理等。通过app.include_router(...)
,这些子应用的路由将被包含到主FastAPI应用中。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
applications
模块中的get_swagger_ui_html
和get_redoc_html
函数来实现的。app = FastAPI(title="XBill",
description="天天账本小程序后台服务",
docs_url="/docs",
openapi_url="/openapi")
/docs
,OpenAPI规范URL为/openapi
。@app.exception_handler(RequestValidationError)
async def validation_exception_handler(request: Request, exc: RequestValidationError):
# ...
RequestValidationError
异常。app.add_middleware(
CORSMiddleware,
allow_origins=['*'],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
'*'
)进行跨域请求,并允许携带凭证、所有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)
asset
, category
, bill
, stat
, preorder
)都定义了自己的路由和处理器,通过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的使用,优化了应用的性能和开发效率。