文章目录
内置权限
可以自定义权限 或者用 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',
}