權限
寫一個類,繼承BasePermission,如果通過返回True,否則False
這里需要配合認證使用,否則沒有user_type屬性。
from rest_framework.permissions import BasePermissionclass UserPermission(BasePermission):def has_permission(self, request, view):# 不是超級用戶不能訪問# 如果認證已經通過了, request 內勇敢有user對象。# 當前登錄用戶user = request.userif user.user_type == 1:return Trueelse:return False
局部使用
在視圖類添加
class TestView(APIView):permission_classes = [app_auth.UserPermission]
全局使用
在配置文件添加
REST_FRAMEWORK={'DEFAULT_PERMISSION_CLASSES':['app_authentication.app_auth.UserPermission',]
}
局部禁用
class TestView(APIView):permission_classes = []
內置頻率
全局配置
未登錄用戶限制
REST_FRAMEWORK={'DEFAULT_THROTTLE_CLASSES': ('rest_framework.throttling.AnonRateThrottle',),'DEFAULT_THROTTLE_RATES': {'anon': '3/m',}
過濾組件
組件是django的,放在rest framework使用
1.安裝
pip install django-filter
2.注冊
INSTALLED_APPS = [...'django_filters', # 需要注冊應用,
]
3.配置
全局配置為例
REST_FRAMEWORK = {...'DEFAULT_FILTER_BACKENDS': ('django_filters.rest_framework.DjangoFilterBackend',)
}
from rest_framework.generics import ListAPIView
from app01.models import Book
from app_authentication.ser import BookModelSerializerclass BookView(ListAPIView):queryset = Book.objects.all()serializer_class = BookModelSerializerfilter_fields = ('name', 'price')
訪問:http://127.0.0.1:8000/app_authentication/bookview/?price=22.10
排序
from rest_framework.filters import OrderingFilter
class Book2View(ListAPIView):queryset = Book.objects.all()serializer_class = BookModelSerializer# 如果有局部過濾功能,在列表添加filter_backends = [OrderingFilter]ordering_fields=('id','price')
訪問:
倒序:http://127.0.0.1:8000/app_authentication/book2view/?ordering=-price
正序:http://127.0.0.1:8000/app_authentication/book2view/?ordering=price
異常處理
1.統一拋出固定格式錯誤信息
2.記日志
自定義異常方法,替換全局使用
# 自定義異常
from rest_framework.views import exception_handler
from rest_framework.response import Response
from rest_framework import status
def my_exception_handler(exc,context):response=exception_handler(exc,context)# response 兩種情況# None drf 沒有處理# Response 對象,django處理,但不符合需求print(type(exc))if not response: # 非空if isinstance(exc,ZeroDivisionError):return Response(data={'status':777,'msg':'除以0錯誤'+str(exc)},status=status.HTTP_400_BAD_REQUEST)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':'app_authentication.app_auth.my_exception_handler'
}
封裝Response對象
class APIResponse(Response):def __init__(self,code=100,msg='成功',data=None,status=None,headers=None,**kwargs):dic={'code':code,'msg':msg}if data:dic={'code':code,'msg':msg,'data':data}# 可以多添加參數dic.update(kwargs)super().__init__(data=dic,status=status,headers=headers)
使用
from app_authentication.app_auth import APIResponse
class TestView4(APIView):def get(self,request,*args,**kwargs):return APIResponse(data={"nane":'abc'},token="sldjfl",aa="123123")# return APIResponse(data={"nane":'abc'})
# return APIResponse(token="sldjfl",aa="123123")