如果要构建应用程序或Web API,则很少将所有内容都放在一个文件中。
FastAPI提供了一种方便的工具,可在保持所有灵活性的同时构建应用程序。
信息
如果您来自Flask,那将相当于Flask的蓝图。
示例文件结构
假设您的文件结构如下:
.
├── app
│ ├── __init__.py
│ ├── main.py
│ └── routers
│ ├── __init__.py
│ ├── items.py
│ └── users.py
小费
有两个__init__.py文件:每个目录或子目录一个。
这就是允许将代码从一个文件导入另一个文件的原因。
例如,app/main.py您可以输入以下内容:
from app.routers import items
该app目录包含所有内容。
该app目录有一个空文件app/__init__.py。
因此,该app目录是“ Python包”(“ Python模块”的集合)。
该app目录还有一个app/main.py文件。
由于它位于Python软件包目录中(因为存在一个文件__init__.py),因此它是该软件包的“模块”:app.main。
有一个子目录app/routers/。
子目录app/routers也有一个空文件__init__.py。
因此,它是一个“ Python子包”。
该文件app/routers/items.py在旁边app/routers/__init__.py。
因此,这是一个子模块:app.routers.items。
该文件app/routers/users.py在旁边app/routers/__init__.py。
因此,这是一个子模块:app.routers.users。
APIRouter
假设专门用于处理用户的文件是的子模块/app/routers/users.py。
您希望将与用户相关的路径操作与其余代码分开,以使其井井有条。
但是它仍然是同一FastAPI应用程序/ Web API的一部分(它是同一“ Python包”的一部分)。
您可以使用来为该模块创建路径操作APIRouter。
进口APIRouter
您可以导入它,并使用与该类相同的方式创建一个“实例”FastAPI:
from fastapi import APIRouter
router = APIRouter()
@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}
路径操作与APIRouter
然后使用它声明路径操作。
以与使用FastAPI类相同的方式使用它:
from fastapi import APIRouter
router = APIRouter()
@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 {"use