From f73cd0826441bfbfcf7514af8bc31b16b3cb2a07 Mon Sep 17 00:00:00 2001 From: djq <1092424998@qq.com> Date: Sat, 8 Nov 2025 00:36:09 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DjangoBlog-master/djangoblog/urls.py | 103 ++++++++++++++---- 1 file changed, 79 insertions(+), 24 deletions(-) diff --git a/src/DjangoBlog-master(1)/DjangoBlog-master/djangoblog/urls.py b/src/DjangoBlog-master(1)/DjangoBlog-master/djangoblog/urls.py index 7e36dc5..4eaabd4 100644 --- a/src/DjangoBlog-master(1)/DjangoBlog-master/djangoblog/urls.py +++ b/src/DjangoBlog-master(1)/DjangoBlog-master/djangoblog/urls.py @@ -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 \ No newline at end of file