drf开发常用工具函数总结(给请求封装通用参数、打印内置属性/方法、动态构建查找条件、yaml读取真正的环境变量、异常处理之自定义异常类和捕捉系统异常)

本文主要是介绍drf开发常用工具函数总结(给请求封装通用参数、打印内置属性/方法、动态构建查找条件、yaml读取真正的环境变量、异常处理之自定义异常类和捕捉系统异常),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

给请求封装通用参数

使用中间件

中间件可以在请求进入视图之前或响应返回给客户端之前执行代码。你可以创建一个自定义中间件来添加通用参数。

class CommonParamsMiddleware:def __init__(self, get_response):self.get_response = get_responsedef __call__(self, request):request.common_params = {'param1': 'value1','param2': 'value2',}response = self.get_response(request)return response

然后在你的settings.py中添加这个中间件:

MIDDLEWARE = [# ..'path.to.your.middleware.CommonParamsMiddleware',
]

在你的视图中,你可以通过request.common_params来访问这些参数。

使用自定义视图基类

如果你想要在视图层面添加通用参数,你可以创建一个自定义的视图基类,并在其他视图中继承它。

# views.py
from rest_framework.views import APIViewclass CommonParamsAPIView(APIView):def initialize_request(self, request, *args, **kwargs):request = super().initialize_request(request, *args, **kwargs)# 在这里添加你的通用参数request.common_params = {'param1': 'value1','param2': 'value2',}return request# 然后在你的其他视图中继承这个基类
class MyView(CommonParamsAPIView):def get(self, request, *args, **kwargs):# 使用通用参数common_params = request.common_params# ...

这样,任何继承CommonParamsAPIView的视图都会自动获得这些通用参数。

使用视图装饰器

如果你不想创建一个新的基类,你也可以使用装饰器来修改视图的行为。

# decorators.py
from functools import wrapsdef add_common_params(view_func):@wraps(view_func)def _decorated(view_instance, request, *args, **kwargs):# 在这里添加你的通用参数request.common_params = {'param1': 'value1','param2': 'value2',}return view_func(view_instance, request, *args, **kwargs)return _decorated# 在你的视图中使用装饰器
from rest_framework.decorators import api_view
from .decorators import add_common_params@api_view(['GET'])
@add_common_params
def my_view(request):# 使用通用参数common_params = request.common_params# ...

选择哪种方法取决于你的具体需求和偏好。中间件适用于全局的请求处理,自定义视图基类和装饰器则提供了更细粒度的控制。

打印所有内置属性/方法

def log_request(self, request):for attr in dir(request):if not attr.startswith('_'):# 检查属性是否存在,避免访问已经被移除的属性if hasattr(request, attr):try:value = getattr(request, attr, None)if not callable(value):print(f"{attr} : {value}")except Exception as e:print(f"Error accessing {attr}: {e}")

callable是一个内置函数,它用来检查一个对象是否是“可调用的”。一个对象如果是可调用的,意味着你可以像函数一样使用它,即可以在后面加上括号和参数来调用它。函数、方法、类以及实现了__call__方法的实例都是可调用的。

动态构建查找条件

def query_some(scope_type, scope_value):# 构建查询参数,其中 scope_type 是一个变量,它的值对应于模型中的字段名filter_kwargs = {scope_type: scope_value}objs = Project.objects.filter(**filter_kwargs).first()if not objs:return os.get("DEFAULT_RESULT")return objs.some_id

从yaml中读取真正的环境变量

# 必须参数
name: "MyNewSpace" 
platform_url: os.getenv("XXX")  #
app_code: os.getenv("YYY")# 非必需参数
desc: "Description of the new space."
def handle_env_var(value):# 尝试匹配 os.getenv("...") 格式并从环境变量中拿取真正的值if isinstance(value, str):match = re.match(r"os\.getenv\(['\"](.*?)['\"]\)", value)if match:return os.getenv(match.group(1))return valueelif isinstance(value, dict):for key, v in value.items():value[key] = handle_env_var(v)return valueelif isinstance(value, list):return [handle_env_var(v) for v in value]else:return value

动态构造序列化器内容:

class TASK_ID_KEY(Enum):TASK_ID = "task_tag"

class DemoQuerySerializer(serializers.Serializer):category = serializers.CharField(help_text="API对应的分类", max_length=255, default="test")# 动态添加字段def __init__(self, *args, **kwargs):super(DemoQuerySerializer, self).__init__(*args, **kwargs)self.fields[TASK_ID_KEY.TASK_ID.value] = serializers.CharField(help_text="task_tag_key", max_length=64)

异常处理

统一返回三段式处理函数

class ThirdPartResponse(Response):def __init__(self,result=True,message="",data=None,extra_data=None,status_code=status.HTTP_200_OK,code=None,):if message:message = "Error code: {}, {}".format(code, message)logger.error(message)standardized_data = {"result": result,"message": message,"data": data,}# 如果传入了extra_data,并且它是一个字典,则将其合并到输出字典中if extra_data and isinstance(extra_data, dict):standardized_data.update(extra_data)super().__init__(standardized_data, status_code)

自定义异常类

from rest_framework import statusclass TokenException(Exception):status_code = status.HTTP_400_BAD_REQUESTcode = 1100error = ""def __init__(self, error):self.error = errorclass TokenAPIError(TokenException):code = 1101error = "get access_token from apigw failed"def __init__(self, error):super().__init__(error)class TokenNotExist(TokenException):code = 1102error = "access_token does not exist in db"def __init__(self, error):super().__init__(error)class APIException(Exception):status_code = status.HTTP_200_OKcode = 1200error = ""def __init__(self, error):self.error = errorclass ThirdPartException(APIException):code = 1201error = "第三方请求错误"def __init__(self, error):super().__init__(error)

抛出和捕捉自定义异常

if not response["result"]:  msg = "原样返回上游平台响应:{}".format(str(response))  logger.error(msg)  raise ThirdPartyException(error=msg)
except IpHostFormatException as e:  return ThreePartResponse(status_code=e.status_code, message=e.error, code=e.code)  

捕捉系统异常

except Exception as e:  msg = "reformat_global_vars error: {}".format(str(e))  logger.error(msg)  return ThreePartResponse(message=msg)

正常返回三段式

return ThreePartResponse(data=serializer.data)

补充返回非三段式

return ThreePartResponse(data=data, extra_data=task_id_dict)

这篇关于drf开发常用工具函数总结(给请求封装通用参数、打印内置属性/方法、动态构建查找条件、yaml读取真正的环境变量、异常处理之自定义异常类和捕捉系统异常)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1067610

相关文章

如何使用 Python 读取 Excel 数据

《如何使用Python读取Excel数据》:本文主要介绍使用Python读取Excel数据的详细教程,通过pandas和openpyxl,你可以轻松读取Excel文件,并进行各种数据处理操... 目录使用 python 读取 Excel 数据的详细教程1. 安装必要的依赖2. 读取 Excel 文件3. 读

SpringBoot请求参数接收控制指南分享

《SpringBoot请求参数接收控制指南分享》:本文主要介绍SpringBoot请求参数接收控制指南,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Spring Boot 请求参数接收控制指南1. 概述2. 有注解时参数接收方式对比3. 无注解时接收参数默认位置

Python的time模块一些常用功能(各种与时间相关的函数)

《Python的time模块一些常用功能(各种与时间相关的函数)》Python的time模块提供了各种与时间相关的函数,包括获取当前时间、处理时间间隔、执行时间测量等,:本文主要介绍Python的... 目录1. 获取当前时间2. 时间格式化3. 延时执行4. 时间戳运算5. 计算代码执行时间6. 转换为指

SpringBoot基于配置实现短信服务策略的动态切换

《SpringBoot基于配置实现短信服务策略的动态切换》这篇文章主要为大家详细介绍了SpringBoot在接入多个短信服务商(如阿里云、腾讯云、华为云)后,如何根据配置或环境切换使用不同的服务商,需... 目录目标功能示例配置(application.yml)配置类绑定短信发送策略接口示例:阿里云 & 腾

关于MongoDB图片URL存储异常问题以及解决

《关于MongoDB图片URL存储异常问题以及解决》:本文主要介绍关于MongoDB图片URL存储异常问题以及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录MongoDB图片URL存储异常问题项目场景问题描述原因分析解决方案预防措施js总结MongoDB图

Spring Boot读取配置文件的五种方式小结

《SpringBoot读取配置文件的五种方式小结》SpringBoot提供了灵活多样的方式来读取配置文件,这篇文章为大家介绍了5种常见的读取方式,文中的示例代码简洁易懂,大家可以根据自己的需要进... 目录1. 配置文件位置与加载顺序2. 读取配置文件的方式汇总方式一:使用 @Value 注解读取配置方式二

一文详解Java异常处理你都了解哪些知识

《一文详解Java异常处理你都了解哪些知识》:本文主要介绍Java异常处理的相关资料,包括异常的分类、捕获和处理异常的语法、常见的异常类型以及自定义异常的实现,文中通过代码介绍的非常详细,需要的朋... 目录前言一、什么是异常二、异常的分类2.1 受检异常2.2 非受检异常三、异常处理的语法3.1 try-

Spring 请求之传递 JSON 数据的操作方法

《Spring请求之传递JSON数据的操作方法》JSON就是一种数据格式,有自己的格式和语法,使用文本表示一个对象或数组的信息,因此JSON本质是字符串,主要负责在不同的语言中数据传递和交换,这... 目录jsON 概念JSON 语法JSON 的语法JSON 的两种结构JSON 字符串和 Java 对象互转

Python正则表达式语法及re模块中的常用函数详解

《Python正则表达式语法及re模块中的常用函数详解》这篇文章主要给大家介绍了关于Python正则表达式语法及re模块中常用函数的相关资料,正则表达式是一种强大的字符串处理工具,可以用于匹配、切分、... 目录概念、作用和步骤语法re模块中的常用函数总结 概念、作用和步骤概念: 本身也是一个字符串,其中

Python使用getopt处理命令行参数示例解析(最佳实践)

《Python使用getopt处理命令行参数示例解析(最佳实践)》getopt模块是Python标准库中一个简单但强大的命令行参数处理工具,它特别适合那些需要快速实现基本命令行参数解析的场景,或者需要... 目录为什么需要处理命令行参数?getopt模块基础实际应用示例与其他参数处理方式的比较常见问http