fastapi封装接口
时间: 2023-11-24 21:02:50 浏览: 181
FastAPI 是一个现代的、快速的 Web 框架,基于 Python。使用 FastAPI 可以快速构建高性能的 Web 服务,专注于 API 的开发。封装接口是 FastAPI 中非常重要的部分之一,通过封装接口可以提高代码的可读性、可维护性和可测试性。
在 FastAPI 中,可以使用装饰器 `@app.get`、`@app.post`、`@app.put`、`@app.delete` 等来装饰路由函数,从而创建 API 端点。在路由函数中,可以通过参数注解的方式来指定请求参数、路径参数、查询参数、请求体等信息,这样可以让代码更加清晰和易于理解。
另外,可以使用 Pydantic 来定义请求体和响应模型,以及数据校验。Pydantic 是 FastAPI 内置的数据验证库,可以自动将请求体和响应数据转换为 Python 对象,从而可以在开发过程中更轻松地处理数据格式转换和校验。
除此之外,FastAPI 还支持中间件的使用,通过中间件可以实现一些通用的逻辑,比如日志记录、身份验证、异常处理等。中间件可以在路由处理之前或之后进行一些操作,从而提高代码的复用性和可拓展性。
综上所述,FastAPI 提供了一种简单而有效的方式来封装接口,它的优秀的性能和易用性,使得开发者能够快速地构建高质量的 Web 服务,满足不同场景下的需求。
相关问题
fastapi 封装yolo
### 封装YOLO模型于FastAPI中
#### 创建项目结构
为了有效地在FastAPI框架内封装YOLO模型并创建API服务,合理的项目结构至关重要。通常情况下,建议按照如下方式组织文件:
```
project/
│── app.py # 主应用程序入口
├── models/ # 存放模型及其配置
│ └── yolo_model.pt # 预训练好的YOLO模型权重文件
└── requirements.txt # 依赖包列表
```
#### 安装必要的库
确保安装了所有必需的Python库来支持FastAPI和YOLO操作。这可以通过`requirements.txt`管理,并使用pip命令安装。
```plaintext
fastapi==0.95.0
uvicorn==0.20.0
torch>=1.8.0 # PyTorch版本需满足YOLOv5的要求
opencv-python-headless # OpenCV用于图像处理而不启动GUI窗口
pydantic # 数据验证与解析
```
#### 加载YOLO模型
在`app.py`中定义一个函数用来加载预训练的YOLO模型实例。这里假设已经有一个名为`yolov5s.pt`的小规模YOLOv5模型作为例子[^1]。
```python
import torch
from fastapi import FastAPI, File, UploadFile
from PIL import Image
import io
# 初始化FastAPI应用
app = FastAPI()
# 加载YOLO模型
model_path = "models/yolov5s.pt"
device = 'cuda' if torch.cuda.is_available() else 'cpu'
model = torch.hub.load('ultralytics/yolov5', 'custom', path=model_path).to(device)
@app.post("/predict/")
async def predict(file: UploadFile = File(...)):
contents = await file.read()
image = Image.open(io.BytesIO(contents))
results = model(image)
predictions = results.pandas().xyxy[0].to_dict(orient="records")
return {"predictions": predictions}
```
上述代码片段展示了如何设置一个POST接口接受上传图片并通过已加载的YOLO模型执行预测任务。返回的结果是以JSON格式呈现的目标检测框位置和其他相关信息。
#### 运行服务器
完成以上步骤之后,就可以通过Uvicorn或其他ASGI服务器运行这个简单的Web服务了。可以在终端输入以下命令启动服务:
```bash
uvicorn app:app --reload
```
这样就成功地在一个轻量级且高效的异步环境中部署了一个基于YOLO的对象识别RESTful API。
fastapi 新增数据库接口
### 如何在 FastAPI 中新增数据库接口的最佳实践
#### 1. 安装依赖库
为了使 FastAPI 应用程序能够连接并操作数据库,通常需要安装相应的 ORM 或者驱动工具。SQLAlchemy 是一种常用的 Python SQL 工具包和对象关系映射器 (ORM),可以很好地与 FastAPI 集成。
```bash
pip install fastapi sqlalchemy databases uvicorn
```
#### 2. 创建项目结构
合理的文件夹布局有助于维护项目的清晰度:
```
project/
│
├── app/
│ ├── __init__.py
│ ├── main.py # 主应用入口
│ ├── models.py # 数据库模型定义
│ ├── schemas.py # Pydantic 模型验证
│ └── crud.py # CRUD 操作逻辑封装
└── alembic/ # 数据库迁移配置(可选)
└── ...
```
#### 3. 初始化 SQLAlchemy 和 Databases 实例
`main.py` 文件中初始化必要的组件来管理数据库会话以及异步查询支持。
```python
from typing import AsyncGenerator, Generator
import databases
import sqlalchemy
from fastapi import Depends, FastAPI
from pydantic import BaseModel
DATABASE_URL = "sqlite:///./test.db"
database = databases.Database(DATABASE_URL)
metadata = sqlalchemy.MetaData()
engine = sqlalchemy.create_engine(
DATABASE_URL,
connect_args={"check_same_thread": False}
)
def get_db() -> Generator:
try:
yield database
finally:
pass
app = FastAPI()
@app.on_event("startup")
async def startup():
await database.connect()
@app.on_event("shutdown")
async def shutdown():
await database.disconnect()
```
#### 4. 定义数据表模式
通过 `models.py` 来描述实体类及其字段属性,并将其映射到实际的关系型表格上。
```python
from sqlalchemy import Column, Integer, String, Table, ForeignKey
from .main import metadata
users_table = Table(
'users', metadata,
Column('id', Integer, primary_key=True),
Column('name', String(50)),
Column('email', String(100))
)
```
#### 5. 构建 API 请求体校验规则
`schemas.py` 使用 Pydantic 提供的数据解析功能确保传入参数的有效性和一致性。
```python
from pydantic import BaseModel, EmailStr
class UserCreate(BaseModel):
name: str
email: EmailStr
class UserRead(UserCreate):
id: int
class Config:
orm_mode = True
```
#### 6. 封装基本增删改查函数
`crud.py` 负责处理具体的业务流程,比如插入新纪录、检索现有条目等。
```python
from sqlalchemy.sql import select
from sqlalchemy.engine.base import Connection
from .schemas import UserCreate
from .models import users_table
async def create_user(conn: Connection, user: UserCreate) -> dict:
query = users_table.insert().values(**user.dict())
result = await conn.execute(query)
return {**user.dict(), "id": result.lastrowid}
async def read_users(conn: Connection) -> list[dict]:
query = select([users_table])
results = await conn.fetch_all(query=query)
return [{column: value for column, value in row.items()} for row in results]
```
#### 7. 设计 RESTful 接口路由
最后,在 `main.py` 添加路径处理器完成对外服务暴露。
```python
from fastapi import HTTPException
from starlette.status import HTTP_404_NOT_FOUND
from .crud import create_user, read_users
from .schemas import UserCreate, UserRead
@app.post("/users/", response_model=UserRead)
async def post_create_user(user: UserCreate, db=Depends(get_db)):
new_user = await create_user(db, user=user)
return new_user
@app.get("/users/")
async def get_read_users(db=Depends(get_db)):
all_users = await read_users(db)
if not all_users:
raise HTTPException(status_code=HTTP_404_NOT_FOUND, detail="No Users Found.")
return {"data": all_users}
```
上述过程展示了如何构建一个简单的 FastAPI Web Service 并集成 SQLite 数据库存储能力[^1]。当然,具体实现细节可能因所选用的不同类型的数据库而有所差异;此外,考虑到生产环境下的性能优化需求,还可以引入诸如缓存机制、分页加载等功能特性进一步增强系统的健壮性。
阅读全文