一、权限

1 权限源码分析

# APIView---->dispatch----> self.initial(request, *args, **kwargs)
# ---->self.check_permissions(request)---->
def check_permissions(self, request):
# get_permissions是apiview的一个方法,得到的是一个列表
# 这个列表的生成和认证一模一样,列表生成式内的可迭代对象是在apisettings里配置的
# 这里我们就可以知道,权限的全局配置,局部配置应该和认证是一模一样的
# 所以这里循环的列表是一个个权限校验类实例化得到的对象
for permission in self.get_permissions():
# 权限校验对象的核心是has_permission方法,返回值必须是bool
# 这个方法接受了三个参数,权限对象,request,视图类对象
if not permission.has_permission(request, self):
self.permission_denied(
request, message=getattr(permission, 'message', None)
)

2 自定义权限类

# uitl
class UserPermission(BasePermission):
def has_permission(self,request,view):
# 权限需要根据request.user判断,所以通常会和认证一起使用
if request.user.user_type == 1:
return True
return False # view
class StudentAPI(ModelViewSet):
authentication_classes = [uitl.TokenAuthentication]
permission_classes = [uitl.UserPermission]
queryset = models.Student.objects
serializer_class = StudentModelSerializer # 局部使用
class TestView(APIView):
permission_classes = [app_auth.UserPermission]
# 全局使用
REST_FRAMEWORK={
"DEFAULT_AUTHENTICATION_CLASSES":["app01.app_auth.MyAuthentication",],
'DEFAULT_PERMISSION_CLASSES': [
'app01.app_auth.UserPermission',
],
}
# 局部禁用
class TestView(APIView):
permission_classes = []

3 内置权限类

from rest_framework.permissions import IsAdminUser
from rest_framework.authentication import SessionAuthentication
class TestView3(APIView):
# 如果要用内置的,就要用全套的内置,不容易出错
authentication_classes=[SessionAuthentication,]
# 判断用户是否是职员,is_stuff
permission_classes = [IsAdminUser]
def get(self,request,*args,**kwargs):
return Response('这是22222222测试数据,超级管理员可以看')

二、频率

1 内置频率设置

# 全局设置
REST_FRAMEWORK = {
'DEFAULT_THROTTLE_CLASSES': (
# 未登陆
'rest_framework.throttling.AnonRateThrottle',
# 已登录,由于是内置的,所以若要使用权限和认证也要使用内置的
'rest_framework.throttling.UserRateThrottle'
),
'DEFAULT_THROTTLE_RATES': {
# 已登录 一分钟10次
'user': '10/m',
# 未登录 一分钟5次
'anon': '5/m',
}
} # 局部配置
class StudentAPI(ModelViewSet):
throttle_classes = [AnonRateThrottle]
queryset = models.Student.objects
serializer_class = StudentModelSerializer
# 这里只设置的频率类,没设置参数,参数只能在全局配置
REST_FRAMEWORK = {
'DEFAULT_THROTTLE_RATES': {
# 未登录 一分钟5次
'anon': '5/m',
}
}

三、过滤

# 安装django-filters
# 在settings注册django-filters
# 在settings配置
REST_FRAMEWORK = {
'DEFAULT_FILTER_BACKENDS': ('django_filters.rest_framework.DjangoFilterBackend',) }
# 在视图类中定义可以过滤的字段
class StudentAPI(ModelViewSet):
# 这里定义了name
# 那么就可以在url后面用拼接筛选条件
# http://127.0.0.1:8000/student/?nanme=hz&id>1
filter_fields = ('name','id')
filter_backends =[DjangoFilterBackend]
queryset = models.Student.objects
serializer_class = StudentModelSerializer

四、排序

from rest_framework.filters import OrderingFilter
class StudentAPI(ModelViewSet):
# 局部配置内置的排序类
filter_backends = [OrderingFilter]
# 限定可排序字段
ordering_fields = ('id', 'price') # 按照id倒序,符号为倒序
http://127.0.0.1:8000/student/?ordering=-id

总结:排序和过滤在局部配置和全局配置都放在一个列表里,只是配置的时候都要加一个限定字段列表,两者可以连用

五、异常处理

# 在drf的settings中
'EXCEPTION_HANDLER': 'rest_framework.views.exception_handler',
# 这表示drf的异常捕获配置方法
def exception_handler(exc, context):
if isinstance(exc, Http404):
exc = exceptions.NotFound()
elif isinstance(exc, PermissionDenied):
exc = exceptions.PermissionDenied()
if isinstance(exc, exceptions.APIException):
headers = {}
if getattr(exc, 'auth_header', None):
headers['WWW-Authenticate'] = exc.auth_header
if getattr(exc, 'wait', None):
headers['Retry-After'] = '%d' % exc.wait
if isinstance(exc.detail, (list, dict)):
data = exc.detail
else:
data = {'detail': exc.detail}
set_rollback()
return Response(data, status=exc.status_code, headers=headers)
return None
# 从上面的源码我们可以读取到几个信息
# 1 drf并没有把所有的异常捕获完,因为最后return None表示没有被drf捕获的异常会被django来捕获
# 2 异常是通过apisettings来配置的,也就是我们可以根据这个方法重写捕获异常 # 全局捕获异常
# 现在项目settings中配置 # 我们要在drf捕获异常的基础上再添加捕获,捕获应当有固定的返回信息
from rest_framework.response import Response
from rest_framework.views import exception_handler
def catch_all_exe(exc, context):
respone = exception_handler(exc, context)
if not respone:
return Response(data={'code':404,'msg':f'drf捕获的异常{str(exc)}'},status=404)
return Response(data={'code':405,'msg':f'django捕获的异常{str(exc)}'},status=405)

drf权限,频率,过滤,排序,异常处理的更多相关文章

  1. DRF 权限 频率

    DRF的权限 权限是什么 大家之前都应该听过权限~那么我们权限到底是做什么用的呢~~ 大家都有博客~或者去一些论坛~一定知道管理员这个角色~ 比如我们申请博客的时候~一定要向管理员申请~也就是说管理员 ...

  2. DRF之权限认证,过滤分页,异常处理

    1. 认证Authentication 在配置文件中配置全局默认的认证方案 REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_f ...

  3. DRF 过滤排序分页异常处理

    DRF 中如何使用过滤,排序,分页,以及报错了如何处理?10分钟get了~

  4. DRF 权限和频率

    Django Rest Framework 权限组件 DRF的权限 权限组件源码解析 我们之前说过了DRF的版本和认证~也知道了权限和频率跟版本认证都是在initial方法里初始化的~~ 其实我们版本 ...

  5. DRF内置过滤组件与排序组件结合使用

    DRF内置过滤组件Filtering DRF提供了内置过滤组件Filtering,可以结合url路径的改变获取想要的数据,当然用户不可能在url访问路径中自己设置过滤条件,肯定是后端开发人员将前端页面 ...

  6. 实战-DRF快速写接口(认证权限频率)

    实战-DRF快速写接口 开发环境 Python3.6 Pycharm专业版2021.2.3 Sqlite3 Django 2.2 djangorestframework3.13 测试工具 Postma ...

  7. ch7-列表渲染(v-for key 数组更新检测 显示过滤/排序结果)

    1 说明 我们用 v-for 指令根据一组数组的选项列表进行渲染. v-for 指令需要以 item in items 形式的特殊语法, items 是源数据数组并且 item 是数组元素迭代的别名. ...

  8. DRF之频率限制、分页、解析器和渲染器

    一.频率限制 1.频率限制是做什么的 开放平台的API接口调用需要限制其频率,以节约服务器资源和避免恶意的频繁调用. 2.频率组件原理 DRF中的频率控制基本原理是基于访问次数和时间的,当然我们可以通 ...

  9. DRF 权限的流程

    DRF 权限的流程 django rest framework,入口是 dispatch,然后依次 --->>封装请求--->>处理版本--->>>认证--- ...

  10. DRF-认证权限频率

    目录 DRF-认证权限频率 认证 登录接口 认证 权限 作用 使用 频率 作用 使用 认证权限频率+五个接口 模型 视图 序列化器 认证权限频率类 配置文件 路由 DRF-认证权限频率 前后端混合开发 ...

随机推荐

  1. 变分(图)自编码器不能直接应用于下游任务(GAE, VGAE, AE, VAE and SAE)

        自编码器是无监督学习领域中一个非常重要的工具.最近由于图神经网络的兴起,图自编码器得到了广泛的关注.笔者最近在做相关的工作,对科研工作中经常遇到的:自编码器(AE),变分自编码器(VAE),图 ...

  2. 关于vue不能像angular深度克隆数据解决办法

    vue要让数据源实现响应式前提必须要在初始化的时候有这个属性 如果没有这个属性,也可实现数据实时响应.解决方法: this.数组/对象.spice(0,1,'属性值') Vue.set(要修改的数组或 ...

  3. vue2.0+Element UI 表格前端分页和后端分页

    之前写过一篇博客,当时对element ui框架还不太了解,分页组件用 html + css 自己写的,比较麻烦,而且只提到了后端分页 (见 https://www.cnblogs.com/zdd20 ...

  4. Springboot 的单元测试

    1 测试基础类 @RunWith(SpringRunner.class) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment. ...

  5. SSM框架处理跨域问题

    什么是跨域 跨域是指从一个域名的网页去请求另一个域名的资源.比如从www.baidu.com 页面去请求 www.google.com 的资源.跨域的严格一点的定义是:只要 协议,域名,端口有任何一个 ...

  6. mysql域名解析引起的远程访问过慢?

    MYSQL远程连接速度慢的解决方法 PHP远程连接MYSQL速度慢,有时远程连接到MYSQL用时4-20秒不等,本地连接MYSQL正常,出现这种问题的主要原因是, 默认安装的MYSQL开启了DNS的反 ...

  7. 撒花,推荐一下我怒肝的 GitHub

    缘起 之前一直有很多小伙伴们找我,让我聊一聊如何学习 Java ,我都直接回复了一个思维导图,后来想一想觉得回答不是很认真,我的初衷是想让小伙伴们根据思维导图中的知识点,采取各个击破 的原则,哪里不会 ...

  8. Backup Database pubs to Disk='D:\DataSQL\pubs.bak' --->动态备份所有数据库

    备份数据库 在项目实施时,备份恢复数据库还是有必要的,自动或傻瓜式的操作比较方便,未测试,失业了,现在静不下心来,有机会要求再做这类操作时实现它,此处先收藏备用 /* <Dynamic SQL ...

  9. 深度解密 Go 语言之 sync.map

    工作中,经常会碰到并发读写 map 而造成 panic 的情况,为什么在并发读写的时候,会 panic 呢?因为在并发读写的情况下,map 里的数据会被写乱,之后就是 Garbage in, garb ...

  10. Dubbo的使用及原理

    Dubbo是什么? Dubbo是阿里巴巴SOA服务化治理方案的核心框架,每天为2,000+个服务提供3,000,000,000+次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点. Dubbo[]是 ...