1 认证组件
2 权限组件
3 频率组件
1 认证组件
(1) 定义一个认证类
class UserAuth():
def authenticate_header(self,reuqest):
pass
def authenticate(self,reuqest):
user_token = request.query_params.get("token")
try:
token = UserToken.objects.get(token=user_token)
# 后面权限会用到
return token.user, token.token
except Exception:
raise APIException("没有认证")
(2) 在需要认证的数据接口里面指定认证类
class BookView(ModelViewSet):
authentication_classes=[UserAuth]
queryset=Book.object.all()
serializer_class=BookSerializer
2 权限组件
(1)定义一个权限类
class UserPerm():
def has_permission(self,reuqest,view):
return None
(2)指定权限验证类
class BookView(APIView):
authentication_classes=[UserAuth]
permission_class=[UserPerm]
queryset=Book.objects.all()
serialize_class=BookSerializer
3 频率组件
(1) 定义一个频率组件
class RateThrottle():
def allow_request(request,self):
if 没有超过限制:
return True
else:
return False
def wait(self):
return 10
(2)指定频率类
class BookView(APIView):
throttle_classes=[RateThrottle]
使用简单的频率控制来控制访问频率(全局)
(1)导入模块
from rest_framework.throttling import SimpleRateThrottle
(2)定义一个类并继承SimpleRateThrottle
class RateThrottle(SimpleRateThrottle):
# 指定访问频率
scope = 'visit_rate'
# 指定通过什么方式来区分用户
def get_cache_key(self, request, view):
return self.get_ident(request)
(3)在setting里面指定频率类和访问频率
REST_FRAMEWORK = {
"DEFAULT_THROTTLE_CLASSES": ('serializer.utils.app_throttles.RateThrottle',),
"DEFAULT_THROTTLE_RATES": {
"visit_rate": "5/m"
}
}
4 url 注册器
(1)导入
from django.urls import re_path,include
from .serializer import views
from rest_framework import routers
(2)生成一个注册器实例对象
router = routers.DefaultRouter()
(3)将自动生成的url注册
router.register(r"books", views.BookView)
(4)开始自动生成url
urlpatterns=[
re_path('^', include(router.urls)),
]
(5)响应器组件
(1)导入
from rest_framework.renderers import JsonRender
(2) 指定返回类
class BookView(APIView):
render_classes=[JsonRender]
(6)分页器组件
(1) 导入
from rest_framework.pagination import PageNumberPerination
(2)获取数据
books=Book.object.all()
(3)创建一个分页器对象
paginater=PageNumberPerination()
(4) 开始分页
paged_books = paginater.paginate_queryset(books, request)
(5) 开始序列化
serialized_books = BookSerializer(paged_books, many=True)
- 返回数据
return Response(serialized_books.data)
(7)分页器组件局部实现
- 导入模块
from rest_framework.pagination import PageNumberPagination
- 自定义一个分页类继承PageNumberPagination
class MyPagination(PageNumberPagination):
page_size = 2
page_query_param = 'p'
page_size_query_param = 'size'
max_page_size = 5
- 实例化一个分页类对象
paginater = MyPagination()
- 开始分页
paged_books = paginater.paginate_queryset(books, request)
- 开始序列化
serialized_books = BookSerializer(paged_books, many=True)
- 返回数据
return Response(serialized_books.data)