认证Authentication
-
目的: 可以参考官方文档, 配置认证内容
-
操作流程:
-
1, 全局配置(setteings.py)
-
# DRF配置信息
REST_FRAMEWORK = {
#1,全局认证
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework.authentication.BasicAuthentication', #此身份验证方案使用HTTP基本身份验证,用于测试使用
'rest_framework.authentication.SessionAuthentication', #自己服务器认证用户
]
}
-
-
2, 局部配置(views.py)
-
#1,视图集
class BookInfoModelViewSet(ModelViewSet):
...
#1,局部认证
authentication_classes = [SessionAuthentication]
-
-
-
注意点:
-
如果配置了全局和局部, 默认使用局部
-
权限Permissions
-
目的: 可以参考官方文档, 配置权限内容
-
操作流程:
-
1, 全局权限配置(settings.py)
-
REST_FRAMEWORK = {
#1,全局认证
...
#2,全局权限
'DEFAULT_PERMISSION_CLASSES': [
# 'rest_framework.permissions.IsAuthenticated', #普通用户
# 'rest_framework.permissions.AllowAny', #所有用户
'rest_framework.permissions.IsAdminUser', #管理员户
]
}
-
-
2, 局部权限配置(views.py)
-
#1,视图集
class BookInfoModelViewSet(ModelViewSet):
...
#1,局部认证
...
#2,局部权限
# permission_classes = [AllowAny]
-
注意点:
如果配置了全局和局部, 默认使用局部
-
限流Throttling
1.全局配置(settings.py)
'DEFAULT_THROTTLE_CLASSES': [
'rest_framework.throttling.AnonRateThrottle', #未认证用户
'rest_framework.throttling.UserRateThrottle' # 以认证用户
],
'DEFAULT_THROTTLE_RATES': {
'anon': '2/day', #未认证 x次/每x
'user': '3/day'# 以认证 x次/每x
}
second`, `minute`, `hour` or `day
second
,minute
,hour
orday
2.局部配置
#1,视图集
class BookInfoModelViewSet(ModelViewSet):
...
#1,局部认证
...
#2,局部权限
...
# 局部限流
throttle_classes = [UserRateThrottle,AnonRateThrottle]
可选限流
-
目的: 可以定义可选限流, 用在不同的类视图中
-
操作流程:
-
1, 全局定义
-
# DRF配置信息
REST_FRAMEWORK = {
...
#4,可选限流
'DEFAULT_THROTTLE_CLASSES': [
'rest_framework.throttling.ScopedRateThrottle',
],
'DEFAULT_THROTTLE_RATES': {
'downloads': '3/minute',
'uploads': '5/minute'
}
}
-
-
2, 局部使用
-
class TestView(APIView):
throttle_scope = "uploads"
def get(self,request):
return Response("testing....")
-
-
分页
-
操作流程
-
1、定义全局
-
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination',
'PAGE_SIZE': 2, # ?limit=2?offset=0并且limit在参数中可以修改
# 'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
# 'PAGE_SIZE': 2 # ?page=2并且不能修改pagesize
-
-
2、定义局部
-
pagination_class = LimitOffsetPagination
pagination_class = PageNumberPagination # 但是这2个的pagesize 都是在setting中定义的
-
-
自定义分页
-
操作流程
-
局部定义
-
在PageNumberPaginantion的源码中说:可以设置但是默认设置未null 可以设置为page_size开启
-
class myPageNumberPagination(PageNumberPagination):
# 设置客户端的请求名
page_size_query_param = 'pagesize'
# 默认设置
page_size = 4
# 设置最大的页面大小
max_page_size = 6
class BookInfoViewSet(ModelViewSet):
...
# 局部分页
pagination_class = myPageNumberPagination
-
过滤器
https://www.django-rest-framework.org/api-guide/filtering/#orderingfilter
使用
排序
https://www.django-rest-framework.org/api-guide/filtering/#orderingfilter
导包
导包路径: from rest_framework import filters
异常过滤器
raise expection("Error")
# 来自APIException的异常页面都是drf风格页面
from rest_framework.exceptions import APIException
raise APIexpection("Error")
现在想要的是 不管是什么异常都可以用drf风格异常页面
-
1、app中新建一个myException
from rest_framework.views import exception_handler
from django.db import DatabaseError
from rest_framework.response import Response
# 定义异常拦截器
def custom_exception_handler(exc, context):
# exc:是异常类型
# Call REST framework's default exception handler first,
# to get the standard error response.
print('哈哈')
# 判断exc是否是APIException类型
response = exception_handler(exc, context)
# Now add the HTTP status code to the response.
if response is not None:
# 如果是APIException
response.data['status_code'] = response.status_code
elif isinstance(exc, DatabaseError):
return Response("数据库异常")
else:
return Response('其他异常')
return response
-
2、在settings.py文件中
-
REST_FRAMEWORK = {
'EXCEPTION_HANDLER': 'booktest.myException.custom_exception_handler'
-
原理
原来也有一个拦截器 只是我们把他重写了
所以 抛出异常==》rest中的setting==》自己的setting这里重写
接口文档
安装
pip instance coreapi
setting
REST_FRAMEWORK = {
'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.coreapi.AutoSchema',
}
路由
path("api-docs/", include_docs_urls("API文档")),
模型类
hgender = models.SmallIntegerField(choices=GENDER_CHOICES, default=0, verbose_name='性别',help_text="性别")
help_text就是api文档中的字段介绍
视图集