|
|
|
|
@ -1,46 +1,90 @@
|
|
|
|
|
import hashlib
|
|
|
|
|
import logging
|
|
|
|
|
from functools import wraps
|
|
|
|
|
from typing import Optional
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 定义明确业务属性的异常类(通常放在单独的 exceptions.py 中)
|
|
|
|
|
class BlogException(Exception):
|
|
|
|
|
"""博客系统基础异常类"""
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class CacheKeyGenerationError(BlogException):
|
|
|
|
|
"""缓存键生成失败(业务属性:缓存相关)"""
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class BlogSettingError(BlogException):
|
|
|
|
|
"""博客设置获取失败(业务属性:系统配置)"""
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class AvatarSaveError(BlogException):
|
|
|
|
|
"""用户头像保存失败(业务属性:用户资源)"""
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
# 导入明确业务属性的异常(假设自定义异常类)
|
|
|
|
|
from djangoblog.exceptions import CacheKeyError
|
|
|
|
|
|
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
|
|
|
|
def cache_decorator(expiration):
|
|
|
|
|
|
|
|
|
|
def cache_decorator(expiration: int):
|
|
|
|
|
def decorator(func):
|
|
|
|
|
@wraps(func)
|
|
|
|
|
def wrapper(*args, **kwargs):
|
|
|
|
|
def news(*args, **kwargs):
|
|
|
|
|
key: Optional[str] = None
|
|
|
|
|
try:
|
|
|
|
|
# 尝试从视图获取缓存键(可能抛出AttributeError)
|
|
|
|
|
view = args[0]
|
|
|
|
|
key = view.get_cache_key()
|
|
|
|
|
except AttributeError as e:
|
|
|
|
|
# 明确捕获视图无get_cache_key方法的异常
|
|
|
|
|
raise CacheKeyGenerationError(
|
|
|
|
|
f"视图对象无get_cache_key方法: {str(e)}"
|
|
|
|
|
) from e
|
|
|
|
|
except Exception as e:
|
|
|
|
|
# 使用明确业务属性的异常类型
|
|
|
|
|
raise CacheKeyError(f"生成缓存键失败: {str(e)}") from e
|
|
|
|
|
# 其他生成缓存键的异常(明确业务属性)
|
|
|
|
|
raise CacheKeyGenerationError(
|
|
|
|
|
f"缓存键生成失败: {str(e)}"
|
|
|
|
|
) from e
|
|
|
|
|
|
|
|
|
|
if not key:
|
|
|
|
|
# 生成替代缓存键
|
|
|
|
|
unique_str = repr((func, args, kwargs))
|
|
|
|
|
m = hashlib.sha256(unique_str.encode('utf-8'))
|
|
|
|
|
key = m.hexdigest()
|
|
|
|
|
# 后续缓存逻辑...
|
|
|
|
|
key = hashlib.sha256(unique_str.encode('utf-8')).hexdigest()
|
|
|
|
|
|
|
|
|
|
# 后续缓存逻辑(示例)
|
|
|
|
|
return func(*args, **kwargs)
|
|
|
|
|
|
|
|
|
|
return news(*args, **kwargs)
|
|
|
|
|
return wrapper
|
|
|
|
|
|
|
|
|
|
return decorator
|
|
|
|
|
|
|
|
|
|
return decorator
|
|
|
|
|
|
|
|
|
|
def get_blog_setting():
|
|
|
|
|
# 假设原逻辑
|
|
|
|
|
value = None
|
|
|
|
|
|
|
|
|
|
def get_blog_setting() -> dict:
|
|
|
|
|
"""获取博客设置(返回字典类型)"""
|
|
|
|
|
value: Optional[dict] = None
|
|
|
|
|
try:
|
|
|
|
|
# 业务逻辑获取value
|
|
|
|
|
pass
|
|
|
|
|
except:
|
|
|
|
|
logger.error("获取博客设置失败")
|
|
|
|
|
logger.info('set cache get_blog_setting')
|
|
|
|
|
# 确保所有分支返回类型一致(假设返回字典)
|
|
|
|
|
# 业务逻辑:从数据库或配置获取设置
|
|
|
|
|
# 示例:value = BlogSettings.objects.first().to_dict()
|
|
|
|
|
value = {"site_name": "djangoblog"} # 模拟正常返回
|
|
|
|
|
except BlogSettingError:
|
|
|
|
|
# 已捕获明确业务异常,直接重新抛出
|
|
|
|
|
raise
|
|
|
|
|
except Exception as e:
|
|
|
|
|
# 其他异常包装为明确业务异常
|
|
|
|
|
raise BlogSettingError(f"获取博客设置失败: {str(e)}") from e
|
|
|
|
|
finally:
|
|
|
|
|
logger.info('set cache get_blog_setting')
|
|
|
|
|
|
|
|
|
|
# 确保返回类型始终为字典
|
|
|
|
|
return value or {}
|
|
|
|
|
|
|
|
|
|
def save_user_avatar(url):
|
|
|
|
|
|
|
|
|
|
def save_user_avatar(url: str) -> str:
|
|
|
|
|
"""
|
|
|
|
|
保存用户头像
|
|
|
|
|
:param url: 头像url
|
|
|
|
|
@ -48,10 +92,21 @@ def save_user_avatar(url):
|
|
|
|
|
"""
|
|
|
|
|
local_path = ""
|
|
|
|
|
try:
|
|
|
|
|
# 下载并保存头像的逻辑
|
|
|
|
|
local_path = "generated_local_path"
|
|
|
|
|
# 业务逻辑:下载并保存头像
|
|
|
|
|
# 示例:
|
|
|
|
|
# response = requests.get(url, timeout=5)
|
|
|
|
|
# local_path = f"avatars/{uuid.uuid4()}.jpg"
|
|
|
|
|
# with open(local_path, 'wb') as f:
|
|
|
|
|
# f.write(response.content)
|
|
|
|
|
local_path = "generated_local_path" # 模拟正常返回
|
|
|
|
|
except (ConnectionError, TimeoutError) as e:
|
|
|
|
|
# 捕获网络相关具体异常
|
|
|
|
|
raise AvatarSaveError(f"头像下载失败: {str(e)}") from e
|
|
|
|
|
except IOError as e:
|
|
|
|
|
# 捕获文件操作异常
|
|
|
|
|
raise AvatarSaveError(f"头像保存到本地失败: {str(e)}") from e
|
|
|
|
|
except Exception as e:
|
|
|
|
|
logger.error(f"保存用户头像失败: {str(e)}")
|
|
|
|
|
# 异常分支返回空字符串,保证返回类型一致
|
|
|
|
|
return ""
|
|
|
|
|
# 其他异常包装为明确业务异常
|
|
|
|
|
raise AvatarSaveError(f"保存用户头像失败: {str(e)}") from e
|
|
|
|
|
|
|
|
|
|
return local_path
|