ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

rest_framework框架的权限,频率,过滤,排序,异常处理

2022-07-20 09:33:23  阅读:156  来源: 互联网

标签:排序 py rest framework import 权限 class


权限

权限可以用来校验用户有没有权限访问固定的资源,权限会在认证之后进行执行,我们可以自定义权限的认证逻辑

1.1自定义权限

# app_auth.py
from rest_framework.permissions import BasePermission
class Mypermission(BasePermission):
	def has_permission(self, request, view): # request是经过包装之后的当此请求,view是我们写的视图类的对象
		user=request.user # 经过认证之后request.user是我们认证之后返回的两个结果的第一个
		if user.user_type==1: # 1代表此用户有访问此资源的权限
			return True	# 若有权限则返回True
		return False

1.2 权限的局部配置和全局配置

1.2.1全局:
# seettings.py
REST_FRAMEWORK={
'DEFAULT_PERMISSION_CLASSES': 
    ['app01.app_auth.Mypermission',] # 支持多个权限校验
}
1.2.2局部:
from app01.app_auth import Mypermission # 导入权限类
class BookView(ModelViewSet): 
	permission_classes = [Mypermission,] # 对此视图类添加权限校验
	queryset = models.Book.objects.all()
	serializer_class = ser.BookSerializer
1.2.2.1 在全局配置权限之后的局部禁用
# view.py
class LoginView(APIView):
permission_classes = [] # 应为登录不需要进行权限校验,所以在局部定义为空,内部查找顺序实现从自己内部查找
def post(self,requets):
    user=models.User.objects.filter(**requets.data).first()
    if user:
        session=uuid4()
        models.Session.objects.update_or_create({'session':session},user=user)
        return Response({'status':200,'msg':'登录成功','session':session})
    return Response({'status':101,'msg':'用户名或密码错误'})

1.3内置权限认证

# 演示一下内置权限的使用:IsAdminUser,控制是否对网站后台有权限的人
# 1 创建超级管理员
# 2 写一个测试视图类
from rest_framework.permissions import IsAdminUser # 内置认证
from rest_framework.authentication import SessionAuthentication # 内置权限,认证和权限要同时用内置的
class TestView(APIView):
	authentication_classes=[SessionAuthentication,]
	permission_classes = [IsAdminUser]
	def get(self,request,*args,**kwargs):
		return Response('这是22222222测试数据,超级管理员可以看')
# 3 超级用户登录到admin,再访问此视图类就有权限
# 4 正常的话,普通管理员,没有权限看(判断的是is_staff字段)

2 频率

2.1 内置的频率限制(限制未登录用户)

2.1.1 全局配置
settings.py
REST_FRAMEWORK = {
	'DEFAULT_THROTTLE_CLASSES': (
		'rest_framework.throttling.AnonRateThrottle', # 对未登录用户的限制(使用的内置的认证)
	),
	'DEFAULT_THROTTLE_RATES': {
		'anon': '3/m', # 未登录用户访问的频率限制,每分钟3次
	}
}

注意:使用频率限制前需要先通过认证和权限,如果不需要进行两个验证,需要在局部将authentication_classes和permission_classes定义为空列表,不然起不到限制访问频率的作用

2.1.2 局部配置
settings.py
REST_FRAMEWORK = {'DEFAULT_THROTTLE_RATES': {'anon': '3/m'}} # 局部配置依然要在setting中配置访问的频率

view.py
from rest_framework.throttling import AnonRateThrottle
class BookView(ModelViewSet):
	queryset = models.Book.objects.all()
	serializer_class = ser.BookSerializer
	permission_classes = []
	authentication_classes = []
	throttle_classes = [AnonRateThrottle] # 对未登录用户限制

2.2 内置的频率限制(限制登陆用户)

注意需要通过内置的认证和权限(关联django内置的用户表)

from rest_framework.authentication import SessionAuthentication # 内置的认证
from rest_framework.permissions import IsAuthenticated # 内置的权限
2.2.1 全局配置
REST_FRAMEWORK={
'DEFAULT_THROTTLE_CLASSES': (
    'rest_framework.throttling.AnonRateThrottle',
    'rest_framework.throttling.UserRateThrottle'
	),
'DEFAULT_THROTTLE_RATES': {
    'user': '10/m',
    'anon': '5/m',
	}
}
2.2.2 局部配置
# settings.py
REST_FRAMEWORK={
	'DEFAULT_THROTTLE_RATES': {
		'user': '10/m',
		'anon': '5/m',
	}
}


# views.py
from rest_framework.authentication import SessionAuthentication
from rest_framework.permissions import IsAuthenticated
from rest_framework.throttling import UserRateThrottle
class BookView(ModelViewSet):
	queryset = models.Book.objects.all()
	serializer_class = ser.BookSerializer
	permission_classes = [IsAuthenticated] # 内置的权限类
	authentication_classes = [SessionAuthentication] # 内置的认证类
	throttle_classes = [UserRateThrottle] # 对登录用户的限制

3 过滤

对于列表数据可能需要根据字段进行过滤,我们可以通过django-filter扩展来增强支持

3.1 安装
pip install django-filter
3.2 注册
INSTALLED_APPS = [
....
'django_filters'
]
3.3 全局配置
# settings.py
REST_FRAMEWORK={
	'DEFAULT_FILTER_BACKENDS': ('django_filters.rest_framework.DjangoFilterBackend',)
}

# view.py
class BookView(ModelViewSet):
	queryset = models.Book.objects.all()
	serializer_class = ser.BookSerializer
	filter_fields=('id',) # 设置可以过滤的字段

配置好后我们可以通过http://127.0.0.1:8000/api/book/?id=1 访问,这里过滤id=1的字段
image

3.4 局部配置
from django_filters.rest_framework import DjangoFilterBackend
class BookView(ModelViewSet):
	queryset = models.Book.objects.all()
	serializer_class = ser.BookSerializer
	filter_backends = [DjangoFilterBackend]
	filter_fields=('id',)

4 排序

4.1 全局使用

# settings.py
REST_FRAMEWORK={
	'DEFAULT_FILTER_BACKENDS': ('rest_framework.filters.OrderingFilter',)
}

class BookView(ModelViewSet):
	queryset = models.Book.objects.all()
	serializer_class = ser.BookSerializer
	ordering_fields=('price',) # 可以排序的字段

4.2 局部使用

class BookView(ModelViewSet):
	queryset = models.Book.objects.all()
	serializer_class = ser.BookSerializer
	ordering_fields=('price',)
	filter_backends = [OrderingFilter]

配置好后我们可以通过http://127.0.0.1:8000/api/book/?ordering=-price(-号代表反向排序)

注意:

image

5 异常处理

对于某些错误,rest_framework已经帮我们处理,如认证错误,权限错误,但返回的格式并不符合接口规范,所以我们可以重写异常处理的方法,以实现对所有错误的处理和对已处理错误信息的规范化返回

5.1异常处理的步骤

5.1.1 自定义异常方法,替换掉全局
5.1.2 写一个方法
5.1.3 自定义异常处理的方法

5.2 具体实现

5.2.1 全局配置自定义异常处理方法,替换默认的
# settings.py
REST_FRAMEWORK={
	'EXCEPTION_HANDLER': 'app01.app_auth.my_exception_handler',
}

# app_auth.py
from rest_framework.response import Response
from rest_framework.views import exception_handler # 默认的异常处理方法

def my_exception_handler(exc, context):
	response = exception_handler(exc, context) # 由于默认的处理了某些错误,所以我们直接调用默认的先进行处理
	if not response: # 对于默认异常处理没有处理的部分进行处理
		return Response({'status': 101, 'msg': '发生了未知错误'}, status=400)
	return Response({'status': 400, 'msg': response.data.get('detail')}, status=400) # 对默认处理结果规范化返回

标签:排序,py,rest,framework,import,权限,class
来源: https://www.cnblogs.com/mress/p/16496154.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有