简单构建高并发
This commit is contained in:
100
app/api.py
Normal file
100
app/api.py
Normal file
@ -0,0 +1,100 @@
|
||||
|
||||
from fastapi import APIRouter, HTTPException, Body, Depends
|
||||
from . import schemas
|
||||
from .services import face_service, FaceRecognitionService
|
||||
|
||||
router = APIRouter()
|
||||
|
||||
# Dependency to get the service instance
|
||||
def get_face_service():
|
||||
return face_service
|
||||
|
||||
@router.post("/register", response_model=schemas.RegisterResponse, summary="注册新的人脸")
|
||||
async def register(request: schemas.RegisterRequest, service: FaceRecognitionService = Depends(get_face_service)):
|
||||
"""
|
||||
为用户注册一张新的人脸。元数据存入PostgreSQL,向量存入Milvus。
|
||||
|
||||
- **功能**: 将一张图片中的人脸与一个用户ID和姓名关联起来。
|
||||
- **校验**:
|
||||
- 检查用户ID是否已被他人注册。
|
||||
- 确保图片中只包含一张清晰可识别的人脸。
|
||||
- **操作**: 如果是新用户,会在PostgreSQL创建用户记录;然后将提取到的人脸特征向量存入Milvus。
|
||||
"""
|
||||
try:
|
||||
if not request.url and not request.face_data:
|
||||
raise ValueError("必须提供图片的url或face_data。")
|
||||
user_info = await service.register_new_face(request.id, request.name, request)
|
||||
return schemas.RegisterResponse(data=user_info)
|
||||
except ValueError as e:
|
||||
raise HTTPException(status_code=400, detail=str(e))
|
||||
except Exception as e:
|
||||
raise HTTPException(status_code=500, detail=f"服务器内部错误: {e}")
|
||||
|
||||
@router.post("/detect", response_model=schemas.DetectResponse, summary="1:N 人脸识别 (Milvus)")
|
||||
async def detect(request: schemas.ImageSource = Body(...), service: FaceRecognitionService = Depends(get_face_service)):
|
||||
"""
|
||||
在一张图片中检测并识别所有已知的人脸。使用Milvus进行高性能向量搜索。
|
||||
|
||||
- **功能**: 对比图片中的人脸与Milvus中的所有人脸,返回匹配结果。
|
||||
- **阈值**: 内部使用相似度阈值来判断是否匹配成功。
|
||||
- **返回**: 返回一个列表,包含所有被识别出的人员信息、位置和置信度。
|
||||
"""
|
||||
try:
|
||||
if not request.url and not request.face_data:
|
||||
raise ValueError("必须提供图片的url或face_data。")
|
||||
detected_faces = await service.detect_faces(request)
|
||||
return schemas.DetectResponse(data=detected_faces)
|
||||
except ValueError as e:
|
||||
raise HTTPException(status_code=400, detail=str(e))
|
||||
except Exception as e:
|
||||
raise HTTPException(status_code=500, detail=f"服务器内部错误: {e}")
|
||||
|
||||
@router.post("/verify", response_model=schemas.VerifyResponse, summary="1:1 人脸认证 (Milvus)")
|
||||
async def verify(request: schemas.VerifyRequest, service: FaceRecognitionService = Depends(get_face_service)):
|
||||
"""
|
||||
验证一张图片中的人脸是否属于指定的用户ID。在Milvus中进行限定范围的向量搜索。
|
||||
|
||||
- **功能**: 精确比对,判断“这张脸是不是这个人”。
|
||||
- **场景**: 用于人脸登录、刷脸支付等高安全要求的场景。
|
||||
- **返回**: 返回布尔值 `match` 表示是否匹配,以及具体的相似度 `confidence`。
|
||||
"""
|
||||
try:
|
||||
if not request.url and not request.face_data:
|
||||
raise ValueError("必须提供图片的url或face_data。")
|
||||
verification_result = await service.verify_face(request.id, request)
|
||||
return schemas.VerifyResponse(data=verification_result)
|
||||
except ValueError as e:
|
||||
raise HTTPException(status_code=400, detail=str(e))
|
||||
except Exception as e:
|
||||
raise HTTPException(status_code=500, detail=f"服务器内部错误: {e}")
|
||||
|
||||
@router.delete("/users/{user_id}", response_model=schemas.StandardResponse, summary="删除用户 (同步删除PG和Milvus)")
|
||||
async def delete_user(user_id: int, service: FaceRecognitionService = Depends(get_face_service)):
|
||||
"""
|
||||
根据用户ID,从PostgreSQL和Milvus中同步删除该用户的所有数据。
|
||||
"""
|
||||
try:
|
||||
deleted_user = await service.delete_user(user_id)
|
||||
return schemas.StandardResponse(message=f"成功删除用户 {deleted_user['name']} (ID: {user_id})。")
|
||||
except ValueError as e:
|
||||
raise HTTPException(status_code=404, detail=str(e))
|
||||
except Exception as e:
|
||||
raise HTTPException(status_code=500, detail=f"服务器内部错误: {e}")
|
||||
|
||||
@router.get("/users/{user_id}", response_model=schemas.RegisterResponse, summary="获取单个用户信息")
|
||||
async def get_user(user_id: int, service: FaceRecognitionService = Depends(get_face_service)):
|
||||
"""
|
||||
根据用户ID,查询并返回用户的详细信息(元数据来自PG,人脸数量来自Milvus)。
|
||||
"""
|
||||
user_info = await service.get_user(user_id)
|
||||
if not user_info:
|
||||
raise HTTPException(status_code=404, detail=f"ID为 {user_id} 的用户不存在。")
|
||||
return schemas.RegisterResponse(data=user_info)
|
||||
|
||||
@router.get("/users", response_model=schemas.UserListResponse, summary="获取所有用户列表")
|
||||
async def list_users(skip: int = 0, limit: int = 100, service: FaceRecognitionService = Depends(get_face_service)):
|
||||
"""
|
||||
获取数据库中所有已注册用户的列表,支持分页(元数据来自PG,人脸数量来自Milvus)。
|
||||
"""
|
||||
users_list = await service.list_all_users(skip=skip, limit=limit)
|
||||
return schemas.UserListResponse(data=users_list)
|
Reference in New Issue
Block a user