1,认证Authentication
-
目的: 可以知道参考文档配置用户程序认证
-
操作流程:
-
1, 全局配置
-
#rest配置 REST_FRAMEWORK = { #1,认证 'DEFAULT_AUTHENTICATION_CLASSES': [ 'rest_framework.authentication.BasicAuthentication', #http验证,用户测试 'rest_framework.authentication.SessionAuthentication', #数据库用户认证 ] }
-
-
2, 局部配置
-
class BookInfoModelViewSet(ModelViewSet): ... #1,局部认证配置 authentication_classes = [SessionAuthentication]
-
-
-
注意点:
- 1,如果全局和局部都配置了, 默认使用局部的
- 2, 认证需要配合权限使用
2,权限Permissions
-
目的: 可以参考文档,配置权限
-
操作流程:
-
1, 全局配置
-
#rest配置 REST_FRAMEWORK = { #1,认证 ... #2,权限 'DEFAULT_PERMISSION_CLASSES': [ # 'rest_framework.permissions.IsAuthenticated', #普通用户 # 'rest_framework.permissions.AllowAny', #所有用户 'rest_framework.permissions.IsAdminUser', #管理员用户 ] }
-
-
2, 局部配置
-
class BookInfoModelViewSet(ModelViewSet): ... #2,局部权限配置 # permission_classes = [AllowAny]
-
-
-
注意点:
- 如果要测试管理员用户需要先创建用户
- python manage.py createsuperuser
- 如果要测试管理员用户需要先创建用户
3,限流Throttling
-
目的:可以通过配置,限制访问次数
-
操作流程:
-
1, 全局设置
-
REST_FRAMEWORK = { ... #3,限流 'DEFAULT_THROTTLE_CLASSES': [ 'rest_framework.throttling.AnonRateThrottle', #匿名 'rest_framework.throttling.UserRateThrottle' #认证用户 ], 'DEFAULT_THROTTLE_RATES': { 'anon': '3/minute', 'user': '5/minute' } }
-
-
2, 局部设置
-
class BookInfoModelViewSet(ModelViewSet): ... throttle_classes = [AnonRateThrottle]
-
-
4, 可选限流
-
目的: 可以配置可选限流, 来限制不同视图的访问
-
操作流程:
-
1, 全局设置
-
REST_FRAMEWORK = { ... #4,可选限流 'DEFAULT_THROTTLE_CLASSES': [ 'rest_framework.throttling.ScopedRateThrottle', ], 'DEFAULT_THROTTLE_RATES': { 'downloads': '3/minute', 'uploads': '2/minute', } }
-
-
2, 局部使用
-
class BookInfoModelViewSet(ModelViewSet): ... #4,可选限流 throttle_scope = "uploads" class TestView(APIView): throttle_scope = "downloads" ...
-
-
5,分页Pagination
-
目的: 可以进行配置, 分页获取数据
-
操作流程:
-
1, 全局配置
-
REST_FRAMEWORK = { ... #5,分页 'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination', 'PAGE_SIZE': 2 }
-
-
2, 局部配置
-
class BookInfoModelViewSet(ModelViewSet): ... #5,局部配置 # pagination_class = LimitOffsetPagination # 使用 ?limit=100 或者 ?offset=400&limit=100 pagination_class = PageNumberPagination #使用 ?page=4
-
-
6, 自定义分页类
-
目的: 可以自定义分页类, 指定页面大小
-
操作流程:
-
1, 定义类
-
#1.自定义分页类 class MyPageNumberPagination(PageNumberPagination): #1,指定页面大小参数 page_size_query_param = "page_size" #2,限定最大的返回值 max_page_size = 5
-
-
2, 类视图使用
-
class BookInfoModelViewSet(ModelViewSet): ... pagination_class = MyPageNumberPagination #使用 ?page=4
-
-
7,过滤Filtering
-
目的: 可以参考文档, 进行过滤的字段的配置
-
操作流程:
-
0,准备工作
-
安装
- pip install django-filter
-
注册(settings.py)
-
INSTALLED_APPS = [ ... 'django_filters' ]
-
-
-
1, 全局配置
-
#rest配置 REST_FRAMEWORK = { ... #6,过滤 'DEFAULT_FILTER_BACKENDS': ['django_filters.rest_framework.DjangoFilterBackend'] }
-
-
2, 局部使用
-
class BookInfoModelViewSet(ModelViewSet): ... #6,局部过滤 # filter_backends = [DjangoFilterBackend] filterset_fields = ['id', 'btitle',"bread"] #过滤的参数
-
-
-
注意点:
- 使用格式: http://127.0.0.1:8000/books/?字段=值
8,排序OrderingFilter
-
目的: 可以指定字段进行升序,或者降序排列
-
操作流程:
-
1, 全局配置,和过滤一样的全局配置
-
2, 局部配置
-
class BookInfoModelViewSet(ModelViewSet): ...'btitle',"bread"] #过滤的参数 #7,排序 filter_backends = [filters.OrderingFilter] ordering_fields = ['id', 'btitle',"bread","bcomment"]
-
-
-
注意点:
- http://127.0.0.1:8000/books/ordering=字段
9,异常处理Exceptions
-
目的: 可以自定义异常方法,处理非DRF中的异常问题
-
DRF中的异常: 只要是APIException或者其子类全部都能处理
-
非DRF异常: 默认是处理不了的
-
操作流程:
-
1, 自定义异常处理方法(my_exception.py)
-
from rest_framework.views import exception_handler from rest_framework.response import Response from django.db import DatabaseError def custom_exception_handler(exc, context): #1,调用系统方法,处理异常 response = exception_handler(exc, context) #2,判断异常是否处理了,如果是NOne证明系统处理不了 if response is not None: response.data['status_code'] = response.status_code else: if isinstance(exc,DatabaseError): response = Response("数据库异常了...") else: response = Response("服务器内容出了其他问题...") return response
-
-
2, 配置异常方法到settings中
-
#rest配置 REST_FRAMEWORK = { ... #7,异常 'EXCEPTION_HANDLER': 'booktest.my_exception.custom_exception_handler' }
-
-
3, 测试
-
class TestView(APIView): def get(self,request): #drf异常处理 # raise APIException("drf内部出现异常了....") #其他异常 raise DatabaseError("数据库崩了...") return Response("test...view...下载....拼命....")
-
-
10,接口文档(了解)
-
目的: 能够使用drf提供的配置进行接口文档的自动生成
-
操作流程:
-
1, 安装
- pip install coreapi
-
2, 根路由
-
url(r'^docs/', include_docs_urls(title='我的api文档...'))
-
-
3, 配置字段信息
-
#模型类(help_text) class BookInfo(models.Model): btitle = models.CharField(max_length=20, verbose_name='名称',help_text="书籍名称") #序列化器 class BookInfoModelSerializer(serializers.ModelSerializer): class Meta: ... #1,额外约束 (help_text) extra_kwargs = { "bpub_date":{ "help_text":"书籍的发布日期" } }
-
-