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 # 从第三条数据开始看两条数据
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通