当前位置: 首页 > 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.dtcms.com/a/256134.html

相关文章:

  • GeoJSON 数据简介
  • Android 终端模拟器 termux app
  • 深入Java面试:从Spring Boot到微服务
  • 【C++语法】类和对象(4)——日期类和const成员函数
  • linux安装minio并使用
  • 使用CommonAPI开发Some/IP的流程
  • Spring-MyBatis基本操作
  • rent8_wechat-最常用出租屋管理系统-微信小程序
  • 华为云Flexus+DeepSeek征文 | 基于Flexus X实例的金融AI Agent开发:智能风控与交易决策系统
  • C++题解:【入门】快乐的马里奥(BFS)
  • 从代码学习深度学习 - 预训练BERT PyTorch版
  • 【LeetCode 热题 100】15. 三数之和——排序 + 双指针解法
  • FastAPI框架的10个重要知识点总结
  • Chromium 136 编译指南 macOS篇:编译流程(五)
  • Linux进程间通信——信号
  • kibana和elasticsearch安装
  • (详细介绍)线性代数中的零空间(Null Space)
  • Git 使用手册:从入门到精通
  • MCPServer编程与CLINE配置调用MCP
  • ubuntu20.04速腾聚创airy驱动调试
  • Redis哨兵模式的学习(三)
  • 百度萝卜快跑携4颗禾赛激光雷达进军迪拜,千辆L4无人车开启全球化战略
  • Tensor的常用计算方法(torch示例说明)
  • RPC - 客户端注册和发现模块
  • Unity Addressable使用之AddressableAssetSettings
  • Java UDP Socket 实时在线刷卡扫码POS消费机服务端示例源码
  • 【全开源】填表问卷统计预约打卡表单系统+uniapp前端
  • 亚马逊认证考试系列 - 第一部份:基础服务 - AWS SAA C03
  • GPT-1 与 BERT 架构
  • Duende Identity Server学习之一:认证服务器及一个Oidc/OAuth认证、用于Machine 2 Machine的客户端