当前位置: 首页 > news >正文

Django中为api自定义一些装饰器:如参数校验等

在Django中使用了rest_framework时,一般我们会定义ModelSerializer来校验request.data中参数是否存在和参数类型。

但当我们只是想简单校验一些api的url上是否存在某些参数时,该怎么办?当然我们也可以通过定义Serializer来实现,但很麻烦。

我们可以自定义请求参数验证装饰器来实现。类似如下(代码不是完整的,只是示例):

from functools import wrapsfrom django.utils import six
from django.utils.decorators import available_attrsdef request_params_required(param_names, raise_exception=False):"""验证request的URL中必须的参数:param param_names::param raise_exception::return:"""def decorator(view_func):@wraps(view_func, assigned=available_attrs(view_func))def _wrapped_view(request, *args, **kwargs):request_params = request.GETif isinstance(param_names, six.string_types):params = (param_names,)else:params = param_namesfor param in params:if param not in request_params:return json_response_request_params_required(param)return view_func(request, *args, **kwargs)return _wrapped_viewreturn decorator

以上代码中使用@wraps(view_func, assigned=available_attrs(view_func))的目的是保留原始函数的身份信息

在需要验证url参数的api上就可以使用上面的请求参数验证装饰器(代码不是完整的,只是示例:

@api_view(['GET'])
@request_params_required('redirect_uri')
def gitlab_login_oauth_uri(request):redirect_uri = request.GET.get('redirect_uri')if not redirect_uri:return api_request_params_required("redirect_uri")client = GitlabOauthClient()oauth_url = client.get_oauth_url(redirect_uri)return api_success({'oauth_url': oauth_url})@api_view(['GET'])
@request_params_required(['page', 'page_size'])
def all_report_list(request):data = []"""省略业务逻辑"""return api_success(data)

上面的装饰器,需要传递格外参数,所以必须是三层。不需要传递参数的装饰器两层就够了。如下一个跳过CSRF验证的装饰器。

def csrf_ignore(view_func):"""Skips the CSRF checks by setting the 'csrf_processing_done' to true."""def wrapped_view(request, *args, **kwargs):request.csrf_processing_done = Truereturn view_func(*args, **kwargs)return wraps(view_func, assigned=available_attrs(view_func))(wrapped_view)

http://www.lryc.cn/news/573353.html

相关文章:

  • 获取 Git 仓库
  • npm包冲突install失败
  • 深入浅出:Go语言中的Cookie、Session和Token认证机制
  • Snapchat矩阵运营新策略:亚矩阵云手机打造高效社交网络
  • SiteAzure:解决数据库服务器内存频繁吃满
  • 【Flutter】状态管理框架Provider和Get对比分析(面试常用)
  • 57-Oracle SQL Profile(23ai)实操
  • 编程基础:耦合
  • 跨平台SEH实现的方法
  • Skrill是什么?中国用户能用吗?安全吗?完整指南
  • DAY 38 Dataset和Dataloader类
  • Python编程语言:2025年AI浪潮下的技术统治与学习红利
  • Python UDP Socket 实时在线刷卡扫码POS消费机服务端示例源码
  • 自动化立体仓库堆垛机控制系统STEP7 FC3功能块 I/O映射
  • `provide` 和 `inject` 组件通讯:实现跨组件层级通讯
  • 机器学习15-XGBoost
  • 微服务拆分——nacos/Feign
  • 华为云Flexus+DeepSeek征文 | 基于Flexus X实例的金融AI Agent开发:智能风控与交易决策系统
  • 李宏毅2025《机器学习》第三讲-AI的脑科学
  • 蓝牙数据通讯,实现内网电脑访问外网电脑
  • WPF调试三种工具介绍:Live Visual Tree、Live Property Explorer与Snoop
  • SylixOS 下的消息队列
  • Jupyter notebook调试:设置断点运行
  • Redis后端的简单了解与使用(项目搭建前置)
  • DeepEP开源MoE模型分布式通信库
  • 洛谷P3953 [NOIP 2017 提高组] 逛公园
  • 【DCS开源项目】—— Lua 如何调用 DLL、DLL 与 DCS World 的交互
  • day44-硬件学习之arm启动代码
  • 【Datawhale组队学习202506】零基础学爬虫 02 数据解析与提取
  • 【simulink】IEEE5节点系统潮流仿真模型(2机5节点全功能基础模型)