deps.py 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. from fastapi import Depends, Header
  2. from pydantic import BaseModel
  3. from app.models.user import User
  4. from app.utils.auth_utils import auth_service
  5. from typing import Optional
  6. import contextvars
  7. from app.core.exceptions import ValidationException, ErrorMessage
  8. class RequestContext(BaseModel):
  9. user: User
  10. workspace: str
  11. authorization: str
  12. source: str
  13. version: str
  14. request_context_var: contextvars.ContextVar[Optional[RequestContext]] = contextvars.ContextVar(
  15. "request_context_var", default=None
  16. )
  17. async def get_request_context(
  18. user: User = Depends(auth_service.verify_and_get_user),
  19. workspace: Optional[str] = Header(None, alias="workspace"),
  20. authorization: Optional[str] = Header(None),
  21. source: Optional[str] = Header(None),
  22. version: Optional[str] = Header(None),
  23. ) -> RequestContext:
  24. """统一封装请求上下文,避免各接口重复处理头信息"""
  25. if not workspace:
  26. raise ValidationException(detail=ErrorMessage.MISSING_PARAM)
  27. ctx = RequestContext(
  28. user=user,
  29. workspace=workspace,
  30. authorization=authorization or "",
  31. source=source or "customer",
  32. version=version or "V6",
  33. )
  34. request_context_var.set(ctx)
  35. return ctx