随笔 - 214  文章 - 12  评论 - 40  阅读 - 38万

FastAPI 工程管理(一) 工程目录管理

作者:麦克煎蛋   出处:https://www.cnblogs.com/mazhiyong/ 转载请保留这段声明,谢谢!

 

我们在构建复杂应用的时候,通常会对工程目录进行合理组织。

FastAPI提供了便利的工具来对应用进行结构化管理,这基本等同于Flask的Blueprints功能。

一、文件结构示例

.
├── app
│   ├── __init__.py
│   ├── main.py
│   └── routers
│       ├── __init__.py
│       ├── items.py
│       └── users.py

二、APIRouter

FastAPI可以基于APIRouter功能对子模块进行组织和管理。

(一)、管理users模块

1、在模块中创建APIRouter的实例。

from fastapi import APIRouter

router = APIRouter()

2、利用APIRouter的实例声明路径操作

我们可以把APIRouter看做一个"小型FastAPI",他们的使用方式完全一样,他们都支持同样的选项和附件操作。

复制代码
@router.get("/users/", tags=["users"])
async def read_users():
    return [{"username": "Foo"}, {"username": "Bar"}]


@router.get("/users/me", tags=["users"])
async def read_user_me():
    return {"username": "fakecurrentuser"}


@router.get("/users/{username}", tags=["users"])
async def read_user(username: str):
    return {"username": username}
复制代码

(二)、管理items模块

这里我们省略了路径前缀、tags等信息。

复制代码
from fastapi import APIRouter, HTTPException

router = APIRouter()


@router.get("/")
async def read_items():
    return [{"name": "Item Foo"}, {"name": "item Bar"}]


@router.get("/{item_id}")
async def read_item(item_id: str):
    return {"name": "Fake Specific Item", "item_id": item_id}


@router.put(
    "/{item_id}",
    tags=["custom"],
    responses={403: {"description": "Operation forbidden"}},
)
async def update_item(item_id: str):
    if item_id != "foo":
        raise HTTPException(status_code=403, detail="You can only update the item: foo")
    return {"item_id": item_id, "name": "The Fighters"}
复制代码

(三)、应用入口管理

我们在应用入口文件中将各个模块组织起来。

1、实例主应用

from fastapi import Depends, FastAPI, Header, HTTPException

app = FastAPI()

2、导入各个子模块

from .routers import items, users

我们也可以使用绝对路径的方式导入子模块

from app.routers import items, users

3、导入router

从各个子模块中导入router:

app.include_router(users.router)

在导入items.router的时候,添加了更多设置信息:

复制代码
async def get_token_header(x_token: str = Header(...)):
    if x_token != "fake-super-secret-token":
        raise HTTPException(status_code=400, detail="X-Token header invalid")

app.include_router(
    items.router,
    prefix="/items",
    tags=["items"],
    dependencies=[Depends(get_token_header)],
    responses={404: {"description": "Not found"}},
)
复制代码

在导入router的时候,可以重复导入同样的router多次,每次前缀不同。这样可以实现在不同的前缀下暴露同样的API。

 

posted on   麦克煎蛋  阅读(3528)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示