request_context.py 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. """
  4. 请求上下文管理器
  5. 为每个API请求提供独立的临时工作空间
  6. """
  7. import uuid
  8. import shutil
  9. from pathlib import Path
  10. import logging
  11. logger = logging.getLogger(__name__)
  12. class RequestContextManager:
  13. """请求级别的临时工作空间管理器"""
  14. def __init__(self, base_dir: str = "temp_requests"):
  15. """
  16. 初始化请求上下文管理器
  17. Args:
  18. base_dir: 临时目录基础路径(项目内相对路径)
  19. """
  20. self.base_dir = Path(base_dir)
  21. self.request_id = str(uuid.uuid4())[:8] # 短UUID,便于日志查看
  22. self.work_dir = None
  23. async def __aenter__(self):
  24. """
  25. 创建请求专用工作目录
  26. Returns:
  27. self: 返回自身,提供request_id和work_dir访问
  28. """
  29. self.work_dir = self.base_dir / f"request_{self.request_id}"
  30. self.work_dir.mkdir(parents=True, exist_ok=True)
  31. logger.info(f"[{self.request_id}] 创建工作目录: {self.work_dir}")
  32. return self
  33. async def __aexit__(self, exc_type, exc_val, exc_tb):
  34. """
  35. 清理工作目录
  36. Args:
  37. exc_type: 异常类型
  38. exc_val: 异常值
  39. exc_tb: 异常追踪
  40. """
  41. if self.work_dir and self.work_dir.exists():
  42. try:
  43. shutil.rmtree(self.work_dir)
  44. logger.info(f"[{self.request_id}] 已清理工作目录")
  45. except Exception as e:
  46. logger.warning(f"[{self.request_id}] 清理工作目录失败: {e}")