refactor: 重构Redis依赖注入以提升代码可维护性

将Redis依赖从Request对象中解耦,改为通过Depends注入,提高代码的可测试性和可维护性
This commit is contained in:
zhangtao
2025-04-15 04:25:07 +08:00
parent da957dca55
commit 7892121066
15 changed files with 160 additions and 136 deletions
@@ -5,6 +5,7 @@ from typing import Union, Dict
from fastapi import APIRouter, Depends, Request, BackgroundTasks, WebSocket
from fastapi.responses import JSONResponse, StreamingResponse
from sqlalchemy.ext.asyncio import AsyncSession
from aioredis import Redis
from app.config.setting import settings
from app.common.response import ErrorResponse, SuccessResponse
@@ -20,7 +21,8 @@ from app.api.v1.schemas.system.auth_schema import (
)
from app.core.dependencies import (
db_getter,
get_current_user
get_current_user,
redis_getter
)
from app.core.router_class import OperationLogRoute
from app.core.security import CustomOAuth2PasswordRequestForm
@@ -33,11 +35,12 @@ router = APIRouter(route_class=OperationLogRoute)
@router.post("/login", summary="登录", description="登录", response_model=JWTOutSchema)
async def login_for_access_token_controller(
request: Request,
redis: Redis = Depends(redis_getter),
login_form: CustomOAuth2PasswordRequestForm = Depends(),
db: AsyncSession = Depends(db_getter),
) -> Union[JSONResponse, Dict]:
user = await LoginService.authenticate_user_service(request=request, login_form=login_form, db=db)
login_token = await LoginService.create_token_service(request=request, username=user.username)
user = await LoginService.authenticate_user_service(request=request, redis=redis, login_form=login_form, db=db)
login_token = await LoginService.create_token_service(redis=redis, username=user.username)
logger.info(f"用户{user.username}登录成功")
# 如果是文档请求,则不记录日志:http://localhost:8000/api/v1/docs
@@ -48,11 +51,11 @@ async def login_for_access_token_controller(
@router.post("/token/refresh", summary="刷新token", description="刷新token", response_model=JWTOutSchema, dependencies=[Depends(get_current_user)])
async def get_new_token_controller(
request: Request,
payload: RefreshTokenPayloadSchema
payload: RefreshTokenPayloadSchema,
redis: Redis = Depends(redis_getter)
) -> JSONResponse:
# 解析当前的访问Token以获取用户名
new_token = await LoginService.refresh_token_service(request=request, refresh_token=payload)
new_token = await LoginService.refresh_token_service(redis=redis, refresh_token=payload)
token_dict = new_token.model_dump()
logger.info(f"刷新token成功: {token_dict}")
return SuccessResponse(data=token_dict, msg="刷新成功")
@@ -60,20 +63,20 @@ async def get_new_token_controller(
@router.post("/captcha/get", summary="获取验证码", description="获取登录验证码", response_model=CaptchaOutSchema)
async def get_captcha_for_login_controller(
request: Request
redis: Redis = Depends(redis_getter)
) -> JSONResponse:
# 获取验证码
captcha = await CaptchaService.get_captcha_service(request=request)
captcha = await CaptchaService.get_captcha_service(redis=redis)
logger.info(f"获取验证码成功")
return SuccessResponse(data=captcha, msg="获取验证码成功")
@router.post('/logout', summary="退出登录", description="退出登录", dependencies=[Depends(get_current_user)])
async def logout_controller(
request: Request,
payload: LogoutPayloadSchema
payload: LogoutPayloadSchema,
redis: Redis = Depends(redis_getter)
) -> JSONResponse:
if await LoginService.logout_services_service(request=request, token=payload):
if await LoginService.logout_services_service(redis=redis, token=payload):
logger.info('退出成功')
return SuccessResponse(msg='退出成功')
return ErrorResponse(msg='退出失败')