python restful api 高并发_RESTful API批量操作的实现

本文介绍了如何解决RESTful API在批量操作时遇到的问题,如资源删除。提出了将批量操作放入请求体并统一使用POST请求的方法,避免URL长度限制和DELETE请求体被剥离的风险。通过在Django的GenericViewSet中加入自定义分发逻辑和BatchMixin,实现了批量创建、更新和删除。同时,为了解决权限判断问题,自定义了BatchModelPermissions,确保了ModelPermission的有效性。
摘要由CSDN通过智能技术生成

要解决的问题

RESTful API对于批量操作存在一定的缺陷。例如资源的删除接口:

DELETE /api/resourse//

如果我们要删除100条数据怎么搞?难道要调用100次接口吗?

比较容易想到的是下面两种方案:

用逗号分割放进url里:/api/resource/1,2,3...

将需要删除的资源的id放到请求体里面

对于方案1,由于浏览器对url的长度存在限制,如果操作的资源过多就无法实现。

对于方案2,这种处理方式存在一定的风险,因为根据RPC标准文档,DELETE的请求体在语义上没有意义,一些网关、代理、防火墙在收到DELETE请求后,会把请求的body直接剥离掉。

所以我参考https://www.npmjs.com/package/restful-api,将批量处理的操作名称和数据全部放到请求体里,统一使用POST请求发送:

POST /api/resource/batch/

Body: {

"method": "create",

"data": [ { "name": "Mr.Bean" }, { "name": "Chaplin" }, { "name": "Jim Carrey" } ]

}

POST /api/resource/batch/

Body: {

"method": "update",

"data": { "1": { "name": "Mr.Bean" }, "2": { "name": "Chaplin" } }

}

POST /api/resource/batch/

Body: {

"method": "delete",

"data": [1, 2, 3]

}

Python实现

环境:python==3.6.5, django==2.2, djangorestframework==3.9.4

在GenericViewSet中加入了一些自定义的分发逻辑,将相应的Batch View放在Mixin里实现可重用。

class BatchGen

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值