dry_day05

文章目录

内置权限

可以自定义权限 或者用 drf内置的权限  但是只能用一套 不能混着用

# 演示一下内置权限的使用: IsAdminUser
	1 创建超级管理员
	
	2 写一个测试视图类
	
	from rest_framework.permissions import IsAdminUser
	from rest_framework.authentication import SessionAuthentication
	
	
	class Test3View(APIView):
	    authentication_classes = [
	        SessionAuthentication]  # 前面 authentication_classes跟自定义权限还是一样  后面[]里面的 因为这里用的是drf内置的类 所以就写它的  若是要自定义 就在[]里面该成自己写的类就行了
	    permission_classes = [IsAdminUser]
	
	    def get(self, request, *args, **kwargs):
	        return Response('这是测试数据, 只有超级管理员才可以查看')

超级用户登录到admin, 再访问test3就有权限

这里的内置IsAdminUser类判断的是is_staff字段

频率

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

全局使用		限制未登录用户一分钟访问五次

REST_FRAMEWORK = {
	'DEFAULT_THROTTLE_CLASSES':(
		'rest_framework.throttling.AnonRateThrottle',
		),
		'DEFAULT_THROTTLE_RATES':{
			'anon':'5/m',
		}
	}

views.py
	# test4 演示全局未登录用户访问频次       settings.py里面已经做好了全局配置  除了这个其它所有的类都有频率限制
from rest_framework.permissions import IsAdminUser
from rest_framework.authentication import SessionAuthentication


class Test4View(APIView):
    authentication_classes = []
    permission_classes = []

    def get(self, request, *args, **kwargs):
        return Response('我是未登录用户')


局部使用
	from rest_framework.throttling import AnonRateThrottle

	class Test5View(APIView):
		throttle_classes = [AnonRateThrottle]
		
settings.py取消全局配置设置 但是频次配置不要取消

限制登陆用户的访问频次

需求: 未登录用户1分钟访问5次, 登录用户一分钟访问十次

在settings.py中

全局
'DEFAULT_THROTTLE_CLASSES': (                       # 这是限制用户(匿名用户、登录用户)的访问频次的配置
		'rest_framework.throttling.AnonRateThrottle',
        'rest_framework.throttling.UserRateThrottle',
		),
    'DEFAULT_THROTTLE_RATES': {                     # 与上面连起来用 具体限制次数
        'user':'10/m',
        'anon':'5/m',
    }

局部配置:
	在视图类中配一个就行
	throttle_classes = [UserRateThrottle]
	全局配了 局部取消
	throttle_classes = []

过滤

1 安装	: pip3 install django-filter
2 注册, 在app中注册
3 全局配  或者局部配
	'DEFAULT_FILTER_BACKENDS':('django_filters.rest_framework.DjangoFilterBackend',)
4 视图类
	from rest_framework.generics import ListAPIView
	from app01.models import Book
	from app01.ser import BookSerializer
	class BookView(ListAPIView):
	    queryset = Book.objects.all()
	    serializer_class = BookSerializer
	    filter_fields = ('name')        # 配置可以按照哪个字段来过滤   注意这里是写元组形式

使用
	http://127.0.0.1:8000/books2/?price=22		过滤出price=22的书

排序

局部使用和全局使用
局部使用
	from rest_framework.generics import ListAPIView
	from rest_framework.filters import OrderingFilter
	from django_filters.rest_framework import DjangoFilterBackend
	from app01.models import Book
	from app01.ser import BookSerializer
	class Book2View(ListAPIView):
	    queryset = Book.objects.all()
	    serializer_class = BookSerializer
	    filter_backends = [OrderingFilter, DjangoFilterBackend]         # 因为排序和过滤都是在 filter_backends 列表里面添加配置  所以两个都要用的话就两个在着写,  如果全局配置了过滤 这里配了局部的排序 想达到两个都有的效果是不行的, 因为排序会覆盖掉过滤
	    filter_fields = ('name', 'price')
	    ordering_fields = ('id', 'price')

urls.py
	path('books2/', views.Book2View.as_view()),

使用:
	http://127.0.0.1:8000/books2/?ordering=-id
	- 号倒序
	不写默认正序
	

异常处理

app_auth.py中
#  自定义异常的处理
from rest_framework.views import exception_handler
from rest_framework.response import Response
from rest_framework import status
def my_exception_handler(exc, context):
    print('进来了')
    response = exception_handler(exc, context)
    print(type(exc))
    # 两张情况, 一个是None, drf没有处理
    # response对象, django处理了, 但是处理的不好
    if not response:
        return Response(data={'status': 999, 'msg': str(exc)}, status=status.HTTP_400_BAD_REQUEST)
    else:
        return Response(data={'status': 888, 'msg': response.data.get('detail')}, status=status.HTTP_400_BAD_REQUEST)

settings.py
配置如下
REST_FRAMEWORK={
    'EXCEPTION_HANDLER': 'app01.app_auth.my_exception_handler',
}
上一篇:pointer-like classes, 关于智能指针


下一篇:文件夹右键进入cmd