DRF框架--认证组件Authentication,权限组件Permissions,限流组件Throttling,过滤组件Filtering,排序组件,分页组件Pagination

认证组件Authentication

可以在配置文件中配置全局默认的认证方案

# DRF的所有的配置项都是写在这个字典中
REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASS':( 'rest_framework.authentication.BasicAuthentication', # 基本认证 'rest_framework.authentication.SessionAuthentication' # session认证 ) }

也可以在每个视图中通过设置authentication_classes属性来设置

from rest_framework.authentication import SessionAuthentication,BasicAuthentication
from rest_framework.views import APIView

class ExampleView(APIView):
    authentication_classes = (SessionAuthentication,BasicAuthentication)
    ...

认证失败会有两种可能的返回值:

  • 401  Unauthorized  未认证
  • 403  Permission Denied  权限被禁止

 

 

权限组件Permissions

权限控制可以限制用户对于视图的访问和对于具体数据对象的访问.

  • 在执行视图的dispatch()方法前,会先进行视图访问权限的判断
  • 在通过get_object()获取具体对象时,会进行对象访问权限的判断

使用:

可以在配置文件中配置默认的权限管理类,如

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES':(
        'rest_framework.permissions.IsAuthenticated',
    )
}

如果未指明,则采用如下默认配置

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES':(
        'rest_framework.permissions.AllowAny',
    )
}

也可以在具体的视图中通过permission_classes属性来设置,如

from rest_framework.permissions import IsAuthenticated
from rest_framework.views import APIView

class ExampleView(APIView):
    permission_classes = (IsAuthenticated,)
    ......

提供的权限:

  • AllowAny  允许所有用户
  • IsAuthenticated  仅通过认证的用户
  • IsAdminUser  仅管理员用户
  • IsAuthenticatedOrReadOnly  认证的用户可以完全操作,否则只能get操作

举例:

复制代码
from rest_framework.authentication import SessionAuthentication
from rest_framework.permissions import IsAuthenticated
from rest_framework.generics import RetrieveAPIView

class BookDetailView(RetrieveAPIView):
    queryset = BookInfo.objects.all()
    serializer_class = BookInfoSerializer
    authentication_classes = [SessionAuthentication]
    permission_classes = [IsAuthenticated]
复制代码

自定义权限:

如果需要自定义权限,需继承rest_framework.permissions.BasePermission父类,并实现以下两个任何一个方法或全部

  • .has_permission(self,request,view)  是否可以访问视图,view表示当前视图对象,限制视图中所有方法
  • .has_object_permission(self,request,view,obj)  是否可以访问数据对象,view表示当前视图,obj为数据对象,限制修改,删除和查看单一数据

例如:

复制代码
class MyPermission(BasePermission)
    def has_object_permission(self,request,view,obj)
        # 控制对obj对象的访问权限,限制详情视图类里面的方法,即限制修改,删除,查看单一数据
        return False

class BookInfoViewSet(ModelViewSet):
    queryset = BookInfo.objects.all()
    serializer_class = BookInfoSerializer
    permission_classes = [IsAuthenticated,MyPermission]
复制代码

 

限流组件Throttling

可以对接口访问的频次进行限制,以减轻服务器压力

使用:

可以在配置文件中,使用DEFAULT_THROTTLE_CLASSES和DEFAULT_THROTTLE_RATES进行全局配置

复制代码
REST_FRAMEWORK = {
        'DEFAULT_THROTTLE_CLASSES':(
              'rest_framework_throttling.AnonRateThrottle',
              'rest_framework_throttling.UserRateThrottle',
      ),
         'DEFAULT_THROTTLE_RATES':{
                'anon':'100/day',
                'user':'1000/day'
      }
}
复制代码

DEFAULT_THROTTLE_RATES可以使用second,minute,hour或day来指明周期

也可以在具体视图中通过throttle_classes属性来配置,如

from rest_framework.throttling import UserRateThrottle
from rest_framework.views import APIView

class Example(APIView):
    throttle_classes = (UserRateThrottle,)
    ...

可选限流类:

1)  AnonRateThrottle

限制所有匿名未认证用户,使用ip区分用户

使用DEFAULT_THROTTLE_RATES['anon'] 来设置频次

2)  UserRateThrottle

限制认证用户,使用User id来区分

使用DEFAULT_THROTTLE_RATES['user']来设置频次

3)  ScopedRateThrottle

限制用户对于每个视图的访问频次,使用ip或user id

例如:

复制代码
class ContactListView(APIView):
    throttle_scope = 'contacts'
    ...

class ContactDetailView(APIView):
    throttle_scope = 'contacts'
    ...

class UploadView(APIView):
    throttle_scope = 'uploads'
    ...
复制代码
复制代码
REST_FRAMEWORK = {
    'DEFAULT_THROTTLE_CLASSES':(
        'rest_framework.throttling.ScopeRateThrottle',
    ),
    'DEFAULT_THROTTLE_RATES':(
        'contacts':'1000/day',
        'uploads':'20/day'
    )
}
复制代码

过滤组件Filtering

对于列表数据可能需要根据字段进行过滤,我们可以通过添加django-filter扩展来增强支持

pip install django-filter

在配置文件中增加过滤后端的配置:

INSTALLED_APPS = [
    ...
    'django_filters',
]

REST_FRAMEWORK = {
    'DEFAULT_FILTER_BACKENDS':['django_filters.rest_framework.DjangoFilterBackend']
}

通过在视图中添加filter_fields属性,指定可以过滤的字段

class BookListView(ListAPIView):
    queryset = BookInfo.objects.all()
    serializer_class = BookInfooSerializer
    filter_fields = ['btitle','bread'] # 建议用列表,不建议用默认的元组

# 127.0.0.1:8000/books/?btitle=红楼梦

排序

对于列表数据,REST framework提供了OrderingFilter过滤器来帮助我们快速指明数据按照指定字段进行排序.

使用方法:

在类视图中设置filter_backends,使用rest_framework.filters.OrderingFilter过滤器,REST framework会在请求的查询字符串参数中检查是否包含了ordering参数,如果包含了ordering参数,则按照ordering参数指明的排序字段对数据集进行排序.

前端可以传递的ordering参数的可选字段值需要在ordering_fields中指明.

示例:

class BookListView(ListAPIView):
    queryset = BookInfo.objects.all()
    serializer_class = BookInfoSerializer
    filter_backends = [OrderingFilter]
    ordering_fields = ('id','bread','bpub_date')
# 127.0.0.1:8000/books/?ordering = -bread 负号代表降序,不带负号代表升序

分页组件Pagination

REST framework提供了分页的支持

我们可以在配置文件中设置全局的分页方式,如:

REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS':'rest_framework.pagination.PageNumberPagination',
    'PAGE_SIZE':100 #每页数目
}

也可以通过自定义Pagination类,来为视图添加不同分页行为.在视图中通过pagination_class属性来指明

class LargeResultsSetPagination(PageNumberPagination):
    page_size = 1000
    page_size_query_param = 'page_size'
    max_page_size = 10000
class BookDetailView(RetrieveAPIView):
    queryset = BookInfo.objects.all()
    serializer_class = BookInfoSerializer
    pagination_class = LargeResultsSetPagination

注意:如果在视图中关闭分页功能,只需在视图内设置

pagination_class = None

可选分页器

1)  PageNumberPagination

前端访问网址形式:

GET http://api.example.org/books/?page=4

可以在子类中定义的属性:

  • page_size 每页数目
  • page_query_param 前端发送的页数关键字名,默认为'page'
  • page_size_query_param 前端发送的每页数目关键字名,默认为None,一般设置为'page_size'
  • max_page_size 前端最多能设置的每页数量
复制代码
from rest_framework.pagination import PageNumberPagination

class StandardPageNumberPagination(PageNumberPagination):
    page_size_query_param = 'page_size'
    max_page_size = 10

class BookListView(ListAPIView):
    queryset = BookInfo.objects.all().order_by('id')
    serializer_class = BookInfoSerializer
    pagination_class = StandardPageNumberPagination

# 127.0.0.1/books/?page=2&page_size=2
复制代码

2)  LimitOffsetPagination

前端访问网址形式:

GET http://api.example.org/books/?limit=100&offset=400

可以在子类中定义的属性:

  • default_limit 默认限制,默认值与PAGE_SIZE设置一致
  • limit_query_param  limit参数名,默认'limit'
  • offset_query_param   offset参数名,默认'offset'
  • max_limit  最大limit限制,默认None
from rest_framework.pagination import LimitOffsetPagination

class BookListView(ListAPIView):
    queryset = BookInfo.objects.all().order_by('id')
    serializer_class = BookInfoSerializer
    pagination_class = LimitOffsetPagination

# 127.0.0.1:8000/books/?offset=3&limit=2  # 从第三条数据开始看两条数据

 

posted @   EricYJChung  阅读(84)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示