29 其他

认证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,hourorday

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

 

 

 

 29 其他

 

 

29 其他

 

 

使用

29 其他

 

 

排序

https://www.django-rest-framework.org/api-guide/filtering/#orderingfilter

29 其他

 

 

29 其他

 

 

导包

导包路径: 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'

29 其他

 

 

原理

29 其他

 

 

原来也有一个拦截器 只是我们把他重写了

所以 抛出异常==》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="性别")

29 其他

 

 

help_text就是api文档中的字段介绍

视图集

29 其他

 

 

 

上一篇:gis安装


下一篇:Android Framework实战视频系列