47 lines
1.5 KiB
Python
47 lines
1.5 KiB
Python
"""
|
||
FastAPI 应用入口。
|
||
|
||
严格遵守全局架构,本文件只负责:
|
||
1. 创建 FastAPI 实例
|
||
2. 注册路由(router)
|
||
3. 统一全局异常返回格式({success, data, message})
|
||
"""
|
||
|
||
from fastapi import FastAPI, Request
|
||
from fastapi.exceptions import RequestValidationError
|
||
from fastapi.responses import JSONResponse
|
||
from starlette.exceptions import HTTPException as StarletteHTTPException
|
||
|
||
from .routers import api_router
|
||
from .schemas import UnifiedResponse
|
||
|
||
# 创建 FastAPI 实例
|
||
app = FastAPI(
|
||
title="MyBlog API",
|
||
description="个人博客系统后端 API(FastAPI + SQLite + JWT)",
|
||
version="0.1.0",
|
||
)
|
||
|
||
|
||
def _unified_error(status_code: int, message: str) -> JSONResponse:
|
||
"""构造符合全局统一格式的错误响应。"""
|
||
return JSONResponse(
|
||
status_code=status_code,
|
||
content=UnifiedResponse(success=False, data=None, message=message).model_dump(),
|
||
)
|
||
|
||
|
||
@app.exception_handler(StarletteHTTPException)
|
||
async def http_exception_handler(request: Request, exc: StarletteHTTPException) -> JSONResponse:
|
||
"""统一 HTTP 异常(业务错误)的返回格式。"""
|
||
return _unified_error(exc.status_code, str(exc.detail))
|
||
|
||
|
||
@app.exception_handler(RequestValidationError)
|
||
async def validation_exception_handler(request: Request, exc: RequestValidationError) -> JSONResponse:
|
||
"""统一请求参数校验错误的返回格式。"""
|
||
return _unified_error(422, "请求参数校验失败")
|
||
|
||
|
||
# 注册路由:后续任务在 routers 包中实现各业务路由后统一挂载
|
||
app.include_router(api_router) |