DRF(9)- 其他功能

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":"书籍的发布日期"
                    }
                }
        

你可能感兴趣的:(DRF)