Django REST Framework(DRF)框架之其他常用API的使用

news2024/9/29 23:36:32

DRF之其他常用API的使用

  • 限流Throttling
    • 限流类
    • 设置全局默认限流策略
    • 基于类视图限流
    • 定义限流频次
    • 自定义限流类
  • 过滤Filtering
    • 查询集过滤
    • 查询参数过滤
    • 使用过滤器组件
    • 使用过滤器
    • 字段过滤
    • 字段排序
  • 分页Pagination
    • 常用分页类
    • 全局与局部的使用
    • 自定义分页类
  • 异常处理Exceptions
    • 常见异常类
    • 异常处理设置
    • 自定义异常处理
    • 异常增强

限流Throttling

DRF中的限流是指对API接口访问的频次进行限制,以减轻服务器压力,以防止恶意用户或者其他原因导致的API滥用。

Throttling可以根据用户的IP地址、用户名或者其他自定义的标识符来限制其访问API的频率。

限流类

DRF中提供了多种内置的限流类,可以根据不同的需求选择合适的限流方式。

常用的限流类:

说明
AnonRateThrottle根据匿名用户的IP地址进行限流。适合希望限制未知来源的请求率
UserRateThrottle根据已认证用户的ID进行限流。适合希望对每个用户进行简单的全局速率限制
ScopedRateThrottle用于限制对 API 特定部分的访问,如视图的访问,根据用户IP或用户ID进行限流。

设置全局默认限流策略

DRF框架默认没有进行全局限流设置,可以在配置文件中,使用DEFAULT_THROTTLE_CLASSES DEFAULT_THROTTLE_RATES进行设置全局的默认限流策略。

1.针对匿名用户和认证用户分别进行限流控制

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        # 基本认证
        'rest_framework.authentication.BasicAuthentication',
        # sesssion认证
        'rest_framework.authentication.SessionAuthentication',
    ),
    'DEFAULT_PERMISSION_CLASSES': (
        # 将全局权限控制方案设置为仅允许认证用户访问
        'rest_framework.permissions.IsAuthenticated',
    ),
    # 限流控制
    'DEFAULT_THROTTLE_CLASSES': (
        # 针对未登录(匿名)用户的限流控制类
        'rest_framework.throttling.AnonRateThrottle',
        # 针对登录(认证)用户的限流控制类
        'rest_framework.throttling.UserRateThrottle'
    ),
    # 指定限流频次
    'DEFAULT_THROTTLE_RATES': {
        # 认证用户的限流频次,一分钟内超过3此访问则出发限流
        'user': '3/minute',
        # 匿名用户的限流频次,一秒内超过3此访问则出发限流
        'anon': '3/second',
    },
}

DEFAULT_THROTTLE_RATES中使用的频率描述可选限流周期单位包括:second、minute、hour、day

2.针对匿名用户和认证用户进行统一的限流控制

'DEFAULT_THROTTLE_CLASSES': (
    'rest_framework.throttling.ScopedRateThrottle',
),

限流测试:
在这里插入图片描述

基于类视图限流

在每个视图或每个视图集的基础上设置限流策略,通过throttle_classess属性配置限流控制类。

class TestView(ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer

    throttle_classes = [AnonRateThrottle]

定义限流频次

可以根据实际需求定义自己的限流频次选择项

 # 指定限流频次选择项
    'DEFAULT_THROTTLE_RATES': {
        'a': '3/minute',
        'b': '2/minute'
    },

使用

class TestView(ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer
	
	# 针对匿名用户和认证用户进行统一的限流控制
    throttle_classes = [ScopedRateThrottle]
    # 指定限流频次项
    throttle_scope = 'a'

自定义限流类

要自定义限流,需要创建一个继承自 BaseThrottle类的子类,并实现其中的 allow_request wait方法。

allow_request 方法用于判断是否允许请求通过,它接收两个参数:请求对象和视图对象。如果返回True,则说明请求被允许通过;否则返回 False,表示请求被拒绝。

wait 方法用于计算下一次请求可通过的时间,它接收三个参数:请求对象、视图对象和当前已发生的请求次数。如果返回 None,则说明请求可以立即通过;否则返回一个时间戳,表示下一次请求可通过的时间。

自定义简单限流示例:

from rest_framework.throttling import BaseThrottle


class MyCustomThrottle(BaseThrottle):
    def allow_request(self, request, view):
        # 在这里编写判断逻辑,返回 True 或 False
        return True

    def wait(self, request, view, num_requests):
        # 在这里编写等待逻辑,返回 None 或下一次请求可通过的时间戳
        return None

过滤Filtering

查询集过滤

class TestView(ModelViewSet):
    queryset = User.objects.all().filter(name='Java')
    serializer_class = UserSerializer

在这里插入图片描述

查询参数过滤

class TestView(ModelViewSet):
    serializer_class = UserSerializer
    queryset = User.objects.all()

    @action(methods=['get'], detail=False)
    def myFun(self, request):
        query_param = request.query_params.get('name', None)
        data = self.queryset.filter(name=query_param)
        newData = list(data.values())  # 将查询集转换为列表
        return JsonResponse(newData, safe=False)  # 将数据转换为JSON格式并返回

访问:http://127.0.0.1:8000//test/myFun/?name=Vue

使用过滤器组件

Django REST framework (DRF) 提供了许多过滤器组件,用于在视图中进行过滤和排序。这些过滤器组件可以轻松地与 Django ORM 进行集成,并对查询结果进行筛选、排序和限制。

常见过滤器组件

1.DjangoFilterBackend

允许使用 Django Filter 库中的过滤器来进行高级查询。通过在视图类中设置 filter_fields 属性来指定可用的过滤字段。

2.SearchFilter

允许用户基于搜索关键字来查找特定的数据。可以通过在视图类中设置 search_fields 属性来指定可用于搜索的字段。

3.OrderingFilter:

允许用户根据选择的字段进行排序。可以通过在视图类中设置 ordering_fields 属性来指定可用于排序的字段。

4.LimitOffsetPagination:

允许将大型数据集分页显示,并允许用户针对每个页面请求特定数量的条目。

5.PageNumberPagination

与 LimitOffsetPagination 类似,但是更加常用,因为它支持按页码进行操作。

使用过滤器

django-filter库包含一个为REST framework提供高度可定制字段过滤的DjangoFilterBackend类,通过添加django-fitlter扩展来增强支持。

安装django-filter

pip install django-filter

在项目settings.py文件中注册应用:

INSTALLED_APPS = [
    'django_filters', 
]

1.全局使用
在settings.py文件中增加过滤后端的配置:

REST_FRAMEWORK = {
	'DEFAULT_FILTER_BACKENDS': (
        'django_filters.rest_framework.DjangoFilterBackend',
        'rest_framework.filters.SearchFilter',
        'rest_framework.filters.OrderingFilter')  
}

2.局部使用
在视图函数或视图集中指定相应的过滤器类和过滤器后端

from rest_framework.filters import OrderingFilter

class TestView(ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer
    # 指定排序类
    filter_backends = [OrderingFilter]
    # 指定排序字段
    ordering_fields = ('id','name')

字段过滤

在视图类属性filter_backends中指定要使用的过滤器类

在视图中添加filter_fields属性,指定可以过滤的字段
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework.viewsets import ModelViewSet

from user.models import User
from user.serializers import UserSerializer


class TestView(ModelViewSet):
    serializer_class = UserSerializer
    queryset = User.objects.all()
    # filter_backends = [DjangoFilterBackend]
    filterset_fields = ("name", "age")

访问:http://127.0.0.1:8000/test/
在这里插入图片描述

访问: http://127.0.0.1:8000/test/?age=30
在这里插入图片描述
访问: http://127.0.0.1:8000/test/?age=20&name=Java
在这里插入图片描述

字段排序

DRF提供了OrderingFilter过滤器来帮助快速指明数据按照指定字段进行排序。

DRF会在请求的查询字符串参数中检查是否包含了ordering参数,如果包含了ordering参数,则按照ordering参数指明的排序字段对数据集进行排序。

from rest_framework.filters import OrderingFilter

class TestView(ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer
    # 指定排序类
    filter_backends = [OrderingFilter]
    # 指定排序字段
    ordering_fields = ('id','name')

访问:http://127.0.0.1:8000/test/?ordering=id
在这里插入图片描述

访问: http://127.0.0.1:8000/test/?ordering=name
在这里插入图片描述

分页Pagination

在DRF中,分页类是用于处理 API 响应数据分页的工具类。DRF 提供了多个分页类可以选择使用,其中最常用的分页类为PageNumberPaginationLimitOffsetPagination

如果在视图内关闭分页功能,只需在视图内设置:pagination_class = None

常用分页类

1.PageNumberPagination

PageNumberPagination是基于页码来进行分页的分页类,它根据请求参数中传递的页码和每页显示的数量来返回相应的结果。

访问URL形式: http://127.0.0.1:8000/test/?page=2

可以在子类中定义的属性:

属性说明
page_size每页数目
page_query_param请求发送的页数关键字名,默认为"page"
page_size_query_param请求发送的每页数目关键字名,默认为None
max_page_size请求最多能设置的每页数量

2.LimitOffsetPagination

LimitOffsetPagination 是基于偏移量和限制条目数来进行分页的分页类,它根据请求参数中传递的偏移量和限制条目数来返回相应的结果。

访问UR形式:http://127.0.0.1:8000/test/?limit=1&offset=2

可以在子类中定义的属性:

属性说明
default_limit默认限制,默认值与PAGE_SIZE设置一直
limit_query_param limit参数名,默认’limit’
offset_query_param offset参数名,默认’offset’
max_limit最大limit限制,默认None

全局与局部的使用

在配置文件中设置全局分页方式,或者在视图类中设置pagination_class属性,并指定需要使用的分页类

1.全局

REST_FRAMEWORK = {
	# 指定使用的分页类
    'DEFAULT_PAGINATION_CLASS':  'rest_framework.pagination.PageNumberPagination',
    'PAGE_SIZE': 2  # 每页数量
}

访问: http://127.0.0.1:8000/test/?page=2
在这里插入图片描述
2.局部

from rest_framework.pagination import PageNumberPagination, LimitOffsetPagination

class TestView(ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer
    pagination_class = PageNumberPagination
    pagination_class = LimitOffsetPagination

自定义分页类

通过自定义Pagination类,来为视图添加不同分页行为。在视图中通过pagination_clas属性来指明。

from rest_framework.pagination import PageNumberPagination
from rest_framework.viewsets import ModelViewSet

from user.models import User
from user.serializers import UserSerializer

class MyPagination(PageNumberPagination):
    page_size = 2
    page_size_query_param = 'page_size'

    
class TestView(ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer
    # 指定当前视图所使用的分页类
    pagination_class = MyPagination

访问: http://127.0.0.1:8000/test/?page_size=3
在这里插入图片描述

from rest_framework.pagination import LimitOffsetPagination

class MyPagination(LimitOffsetPagination):
    default_limit = 1
    max_limit = 2
    
class TestView(ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer
    # 指定当前视图所使用的分页类
    pagination_class = MyPagination

访问:http://127.0.0.1:8000//test/?limit=2&offset=2
在这里插入图片描述

异常处理Exceptions

在DRF中,异常处理是通过在视图函数中捕获异常来完成的。当出现异常时,将生成一个标准响应,其中包含有关异常的详细信息。

常见异常类

DRF提供了异常处理,常见的DRF异常类如下:

异常类描述
APIException所有异常的父类
ValidationError当验证失败时引发的异常
ParseError当无法解析请求体时引发的异常
AuthenticationFailed当身份验证失败时引发的异常
NotAuthenticated尚未认证引发的异常
PermissionDenied当用户权限不足时引发的异常
NotFound当未找到资源时引发的异常
MethodNotAllowed当尝试使用不支持的HTTP方法或操作时引发的异常
UnsupportedMediaType当请求使用了不受支持的媒体类型时引发的异常
NotAcceptable要获取的数据格式不支持引发的异常
Throttled超过限流次数引发的异常

异常处理设置

DRF框架默认使用rest_framework.views.exception_handler模块下的exception_handler函数进行异常处理。

默认异常处理设置:

REST_FRAMEWORK = {
    'EXCEPTION_HANDLER': 'rest_framework.views.exception_handler'
}

自定义异常处理

可以通过定义自己的异常类来扩展这些异常,并在视图函数中捕获和处理它们。要定义自己的异常类,请从DRF中的APIException类继承,并设置status_code属性和default_detail属性

from rest_framework.exceptions import APIException

class MyException(APIException):
    status_code = 400
    default_detail = '自定义异常信息'

在视图函数中,您可以使用try/except块来捕获异常并返回相应的响应:

class TestView(APIView):
    def get(self, request):
        try:
            print("do something")
            1/0
        except ZeroDivisionError as e:
            raise MyException()
        return Response({'msg': "OK"}, status=200)
urlpatterns = [
re_path(r'test/', views.TestView.as_view(), name='test'),
]

在这里插入图片描述

异常增强

DRF框架提供了很多异常处理函数,但有时候我们可能需要补充一些其他的异常信息处理。因此,可以在DRF框架异常处理函数的基础上,进行异常信息的增强。

from rest_framework import status
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework.views import exception_handler as drf_exception_handler

def exception_handler(exc, context):
    # 先调用DRF框架的默认异常处理函数
    response = drf_exception_handler(exc, context)

    if response is None:
        view = context['view']
        # 补充异常处理
        if isinstance(exc, ZeroDivisionError):
            print('[%s]: %s' % (view, type(exc)))
            response = Response({'msg': '除数不能为零'}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)

    return response


class TestView(APIView):
    def get(self, request):
        1 / 0
        return Response({'msg': "OK"}, status=200)

在配置文件中声明自定义的异常处理:

REST_FRAMEWORK = {
    'EXCEPTION_HANDLER': 'user.utils.exceptions.exception_handler'
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/438183.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Docder 安装——Windows版

Docder 安装——Windows版 docder 下载地址 https://smartidedl.blob.core.chinacloudapi.cn/docker/20210926/Docker-win.exe 1、使用 PowerShell 启用 Hyper-V 以管理员身份打开 PowerShell 控制台,运行以下命令: Enable-WindowsOptionalFeature -On…

在flowforge中使用模版配置来自定义node-red实例

添加模版设置 在FlowForge中,每个项目都是从模板创建的。模板为项目定义了一组预配置的选项。这包括运行时设置- 比较常见就是 Node-RED settings.js文件中设置的值。 模板还定义了项目可以自定义哪些选项。 本篇文章就来解释一下如何向模板对象中添加新的Node-RED运行时选项…

365天深度学习打卡 YOLOv5白皮书-第Y4周:common.py文件解读

YOLOv5白皮书-第Y4周:common.py文件解读 🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊|接辅导、项目定制 文件位置:./models/common.py 该文件是实现YOLO算法中各个模块的地方&#…

【Cpp】手撕搜索二叉树(KV模型)

文章目录 二叉搜索树的应用搜索二叉树(KV模型)代码:二叉搜索树的性能分析 二叉搜索树的应用 K模型:K模型即只有key作为关键码,结构中只需要存储Key即可,关键码即为需要搜索到的值。 比如:给一个单词word,判断该单词是…

水果FL Studio21最新中文完整版下载更新及内容介绍

简单总结一下,本次小版本更新最重要的内容,我个人认为是对于M1芯片的适配。其余的比如EQ2,3x这些我们很熟悉的插件虽说也有更新,但是估计并没有特别大的改动。我个人的话会先放一段时间,等下次有其他更让我感兴趣的内容…

吃透SpringMVC面试八股文

说说你对 SpringMVC 的理解 SpringMVC是一种基于 Java 的实现MVC设计模型的请求驱动类型的轻量级Web框架,属于Spring框架的一个模块。 它通过一套注解,让一个简单的Java类成为处理请求的控制器,而无须实现任何接口。同时它还支持RESTful编程…

【智能电网】智能电网中针对DOS和FDIA的弹性分布式EMA(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

burpsuite的基本使用

一,Proxy(代理) 目录 一,Proxy(代理) 1.1 intercept (拦截) 1.2 HTTP history(HTTP历史记录) 1.3 WebSockets history 1.4 options(选项&am…

转换CAJ到PDF: 教你如何转换这两种文件格式

在现代信息化社会中,我们常常需要处理各种文件格式,例如常见的文本文档、PDF、图片、视频等等。其中,学术界或者专业人士常常会接触到一种叫做CAJ格式的文件,而这个格式在阅读、编辑以及分享方面可能存在一些限制。为了解决这个问…

影响LED显示屏使用的因素

LED显示屏和其他物品一样,在使用中不免遇到这样或那样的问题。在使用LED显示屏的时候,可能会因散热设计、混灯八个问题,导致困难或影响LED显示屏的使用。而为能使LED显示屏的后期使用效能稳定,首先要做的就是预防它的老化。下面为…

Python OpenCV3 计算机视觉秘籍:6~9

原文:OpenCV 3 Computer Vision with Python Cookbook 协议:CC BY-NC-SA 4.0 译者:飞龙 本文来自【ApacheCN 计算机视觉 译文集】,采用译后编辑(MTPE)流程来尽可能提升效率。 当别人说你没有底线的时候&…

一文搞懂新型IO调度器BFQ简介

Linux io调度器有很多种,大多数调度器都经受住了各种市场环境的长时间验证,稳定性、性能得到各种用户的认可,但新的调度器依然展露头角,在4.12内核中出现了一个新的bfq调度器,这个调度器将取代曾经的辉煌的cfq调度器。…

Python3使用sys.argv和os.system 从一个程序调用另一个程序,并将参数传递

由于实验需要,需要从A.py 调用另一个B.py,并将A.py中的参数mean、max、min三个值传递给B。 这里参考了其他人的文章 http://t.csdn.cn/cQKio http://t.csdn.cn/QNqml http://t.csdn.cn/yEJeD 参考其他人的程序,发现其实很简单,…

ctfshow web入门代码审计 web301-305

1.web301 共有这几个文件 #checklogin.php <?php error_reporting(0); session_start(); require conn.php; $_POST[userid]!empty($_POST[userid])?$_POST[userid]:""; $_POST[userpwd]!empty($_POST[userpwd])?$_POST[userpwd]:""; $username$_PO…

LLVM编译器后端比较功能的添加

1.动机 从机器层面上来看&#xff0c;控制流类的跳转指令分为无条件跳转和有条件跳转&#xff0c;无条件跳转 JMP&#xff0c;有条件跳转 JEQ、JNE、JLT、JGT、JLE、JGE&#xff0c;这部分指令是需要通过检查 condition code &#xff08;SW 寄存器&#xff09;来决定跳转条件&…

解析基于Pytorch的残差神经网络(ResNet18模型),并使用数据集CIFAR10来进行预测与训练

解析基于Pytorch的残差神经网络&#xff08;ResNet18模型&#xff09;&#xff0c;并使用数据集CIFAR10来进行预测与训练 1.0、什么是残差神经网络 注&#xff1a;本人才疏学浅&#xff0c;如有纰漏&#xff0c;请不吝赐教 残差神经网络其实是与卷积神经网络分不开的&#x…

Java项目无法启动排查

Java项目无法启动排查 1.启动服务发现 无法写入日志也无法启动项目2.df查看磁盘占用情况 、free -h查看内存占用、top查看CPU使用率负载率3.此时磁盘满4.清理磁盘5.定时任务 1.启动服务发现 无法写入日志也无法启动项目 2.df查看磁盘占用情况 、free -h查看内存占用、top查看C…

计及源荷不确定性的综合能源生产单元运行调度与容量配置优化研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

java贸易企业工作信息管理与利润返现系统sxA5进销存程序

目 录 摘 要 I Abstract II 第1章 绪论 1 1.1 课题背景 1 1.2 研究现状 1 本章小结 1 第2章 可行性分析 2 2.1 经济可行性 2 2.2 技术可行性 2 2.3 操作可行性 2 2.4 业务流程分析 3 本章小结 3 第3章 需求分析 4 3.1 需求分析 4 …

数据库基础篇 《3. 基本的SELECT语句》

目录 1. SQL概述 1.1 SQL背景知识 1.2 SQL语言排行榜 1.3 SQL 分类 2. SQL语言的规则与规范 2.1 基本规则 2.2 SQL大小写规范 &#xff08;建议遵守&#xff09; 2.3 注释 2.4 命名规则&#xff08;暂时了解&#xff09; 2.5 数据导入指令 3. 基本的SELECT语句 3.0…