drf 认证、权限、限流、过滤、排序、分页器
认证Authentication
准备工作:(需要结合权限用)
1. 需要使用到登陆功能,所以我们使用django内置admin站点并创建一个管理员。
python manage.py createsuperuser
2. 配置 settings.py
1.站点语言配置:
# LANGUAGE_CODE = 'en-us'
LANGUAGE_CODE = 'zh-hans' # 配置中文
开始认证Authentication 配置文件:
(1)可以在配置文件中配置全局默认的认证方案:
REST_FRAMEWORK = {
'DEFAULT_RENDERER_CLASSES': ( # 默认响应渲染类
'rest_framework.renderers.JSONRenderer', # json渲染器
'rest_framework.renderers.BrowsableAPIRenderer', # 浏览API渲染器
),
# 认证数据的记录方式
'DEFAULT_AUTHENTICATION_CLASSES': (
# 这里我们会加上jwt
'rest_framework.authentication.BasicAuthentication', # 基本认证
'rest_framework.authentication.SessionAuthentication', # session认证
),}
(2)也可以在每个视图中通过设置authentication_classess属性来设置
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 权限被禁止
2. 权限Permissions
权限控制可以限制用户对于视图的访问和对于具体数据对象的访问。
在执行视图的dispatch()方法前,会先进行视图访问权限的判断
在通过get_object()获取具体对象时,会进行模型对象访问权限的判断
使用
1.可以在配置文件中设置默认的权限管理类,如
# 权限管理类
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.IsAuthenticated',
),
}
如果未指明,则采用如下默认配置,在REST_FRAMEWORK ={}中:
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.AllowAny',
)
2.也可以在具体的视图中通过permission_classes属性来设置,views.py 中:from rest_framework.decorators import action
from rest_framework.viewsets import ModelViewSet
from book.models import Book
from .serializers import BookModelSerializer # 用户认证
from rest_framework.authentication import BaseAuthentication,SessionAuthentication
# 权限
from rest_framework.permissions import IsAuthenticated from rest_framework.permissions import BasePermission
# 自定义权限 ,必须继承 BasePermission
class CustomPermission(BasePermission):
def has_permission(self, request, view):
# 当前权限方法用于判断访问者是否有权限访问对应的视图
# 获取当前已经登录的用户可以用request.user
return request.user.username=='wang' # 返回的是布尔值 # 视图:
class BookModelSetView(ModelViewSet):
queryset = Book.objects.all()
serializer_class = BookModelSerializer
# 只是设置了认证方式,还需要结合权限来 ,这里会报错, .authenticate() must be overridden.
#authentication_classes = [SessionAuthentication,BaseAuthentication]
# 权限
# permission_classes = [IsAuthenticated]
permission_classes = [CustomPermission]
提供的权限
AllowAny 允许所有用户
IsAuthenticated 仅通过认证的用户
IsAdminUser 仅管理员用户
IsAuthenticatedOrReadOnly 已经登陆认证的用户可以对数据进行增删改操作,没有登陆认证的只能查看数据。
自定义权限
如需自定义权限,需继承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]
3. 限流Throttling
可以对接口访问的频次进行限制,以减轻服务器压力。
使用
1. 可以在配置文件中,使用DEFAULT_THROTTLE_CLASSES 和 DEFAULT_THROTTLE_RATES进行全局配置,
REST_FRAMEWORK = {
# 限流
'DEFAULT_THROTTLE_CLASSES': (
'rest_framework.throttling.AnonRateThrottle',# 普通用户
'rest_framework.throttling.UserRateThrottle' # 登录用户
),
'DEFAULT_THROTTLE_RATES': {
'anon': '3/day', # 一天只能访问3次
'user': '5/day' # 一天只能访问5次
},
}
DEFAULT_THROTTLE_RATES 可以使用 second, minute, hour 或day来指明周期。
2.也可以在具体视图中通过throttle_classess属性来配置,如
from rest_framework.response import Response
from rest_framework.viewsets import ModelViewSet
from book.models import Book
from .serializers import BookModelSerializer # 限流
from rest_framework.throttling import AnonRateThrottle,UserRateThrottle
class BookModelSetView(ModelViewSet):
queryset = Book.objects.all()
serializer_class = BookModelSerializer
# 限流
throttle_classes = [AnonRateThrottle,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.ScopedRateThrottle',
),
'DEFAULT_THROTTLE_RATES': {
'contacts': '1000/day',
'uploads': '20/day'
}
}
4. 过滤Filtering
对于列表数据可能需要根据字段进行过滤,我们可以通过添加django-fitlter扩展来增强支持。
pip install django-filter
1.在配置文件中增加过滤后端的设置:
1.注册应用:
INSTALLED_APPS = [
'django_filters', # 需要注册应用,
]
2.配置
# drf框架的配置字典,所以关于drf的配置信息,要记录在这里即可。
REST_FRAMEWORK = { 'DEFAULT_FILTER_BACKENDS': ('django_filters.rest_framework.DjangoFilterBackend',),
}
在视图中添加filter_fields属性,指定可以过滤的字段
访问时:127.0.0.1:8000/books/?btitle=西游记
from rest_framework.response import Response
from rest_framework.viewsets import ModelViewSet
from book.models import Book
from .serializers import BookModelSerializer
# 过滤排序
from rest_framework.filters import OrderingFilter class BookModelSetView(ModelViewSet): queryset = Book.objects.all() serializer_class = BookModelSerializer
# 过滤
filter_fields = ('title', 'bread')
5. 排序
对于列表数据,REST framework提供了OrderingFilter过滤器来帮助我们快速指明数据按照指定字段进行排序。
使用方法:
在类视图中设置filter_backends,使用rest_framework.filters.OrderingFilter过滤器,
REST framework会在请求的查询字符串参数中检查是否包含了ordering参数,如果包含了ordering参数,
则按照ordering参数指明的排序字段对数据集进行排序。
前端可以传递的ordering参数的可选字段值需要在ordering_fields中指明。
示例:
# 127.0.0.1:8000/books/?ordering=-bread
from rest_framework.response import Response
from rest_framework.viewsets import ModelViewSet
from book.models import Book
from .serializers import BookModelSerializer # 过滤排序
from rest_framework.filters import OrderingFilter class BookModelSetView(ModelViewSet): queryset = Book.objects.all()
serializer_class = BookModelSerializer
# 过滤
filter_fields = ('title', 'bread')
# 过滤排序
filter_backends = [OrderingFilter]
OrderingFilter=['id','bread','bcommnet']
6. 分页Pagination
REST framework提供了分页的支持。
1.可以在配置文件中设置全局的分页方式,如:
# drf框架的配置字典,所以关于drf的配置信息,要记录在这里即可。
REST_FRAMEWORK = {
# 分页配置[全局配置,针对整个项目所有列表视图都会产生分页效果]
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
'PAGE_SIZE': 2, # 每页数目
}
2.也可通过自定义Pagination类,来为视图添加不同分页行为。在视图中通过pagination_clas属性来指明。
from rest_framework.response import Response
from rest_framework.viewsets import ModelViewSet
from book.models import Book
from .serializers import BookModelSerializer
# 自定义分页器
from rest_framework.pagination import PageNumberPagination
class BookPageNumberPagination(PageNumberPagination):
page_size = 3
max_page_size = 10
page_query_param = 'page_size'
## http;//loclahost/?page_size=5 class BookModelSetView(ModelViewSet):
queryset = Book.objects.all()
serializer_class = BookModelSerializer
# 分页
# 指定当前视图类的列表视图[局部配置]
# pagination_class = BookPageNumberPagination
pagination_class = None # 阻止全局的分页配置给当前的列表视图生成分页效果
注意:如果在视图内关闭分页功能,只需在视图内设置
pagination_class = None
可选分页器
1) PageNumberPagination
前端访问网址形式:
GET http://api.example.org/books/?page=4
可以在子类中定义的属性:
page_size 每页数目
page_query_param 前端发送的页数关键字名,默认为"page"
page_size_query_param 前端发送的每页数目关键字名,默认为None
max_page_size 前端最多能设置的每页数量
view.py 视图中:
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=1&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
drf 认证、权限、限流、过滤、排序、分页器的更多相关文章
- 三 drf 认证,权限,限流,过滤,排序,分页,异常处理,接口文档,集xadmin的使用
因为接下来的功能中需要使用到登陆功能,所以我们使用django内置admin站点并创建一个管理员. python manage.py createsuperuser 创建管理员以后,访问admin站点 ...
- day74:drf:drf其他功能:认证/权限/限流/过滤/排序/分页/异常处理&自动生成接口文档
目录 1.django-admin 2.认证:Authentication 3.权限:Permissions 4.限流:Throttling 5.过滤:Filtering 6.排序:OrderingF ...
- django-rest-framework-源码解析004-三大验证(认证/权限/限流)
三大验证模块概述 在DRF的APIView重写的dispatch方法中, self.initial(request, *args, **kwargs) 这句话就是执行三大验证的逻辑, 点进去可以看到 ...
- (四) DRF认证, 权限, 节流
一.Token 认证的来龙去脉 摘要 Token 是在服务端产生的.如果前端使用用户名/密码向服务端请求认证,服务端认证成功,那么在服务端会返回 Token 给前端.前端可以在每次请求的时候带上 To ...
- DRF 认证 权限 视图 频率
认证组件 使用:写一个认证类,继承BaseAuthentication 在类中写authenticate方法,把request对象传入 能从request对象中取出用户携带的token根据token判 ...
- SpringCloud(8)---zuul权限校验、接口限流
zuul权限校验.接口限流 一.权限校验搭建 正常项目开发时,权限校验可以考虑JWT和springSecurity结合进行权限校验,这个后期会总结,这里做个基于ZuulFilter过滤器进行一个简单的 ...
- 45.限流Throttling及源码解析
什么是限流? 限流类似于权限机制,它也决定是否接受当前请求,用于控制客户端在某段时间内允许向API发出请求的次数,也就是频率 假设有客户端(比如爬虫程序)短时间发起大量请求,超过了服务器能够处理的能力 ...
- Sentinel限流实现原理
Sentinel限流的神秘面纱: 之前我们学习过限流比较主流的三种算法:漏桶,令牌桶,滑动窗口.而Sentinel采用的是最后一种,滑动窗口来实现限流的. 通过对Sentinel基础Api的使用,我们 ...
- 2. DRF 认证、权限、限流、分页、过滤、序列 化
2.1 user/urls.py ModelViewSet注册路由三部曲 from django.urls import include, path from user import views ...
随机推荐
- Windows 安装Java与配置环境变量
window系统安装java 下载JDK 首先我们需要下载java开发工具包JDK,下载地址:http://www.oracle.com/technetwork/java/javase/downloa ...
- CentOS7 系统升级,删除centos7开机界面多余选,升级至最新的内核
一:升级系统 1.检查系统版本: [root@localhost /]# cat /etc/redhat-release CentOS Linux release (Core) 2.运行yum命令升级 ...
- P3727 曼哈顿计划E
点分治+SG函数还真是令人意外的组合啊 思路 这道题看到找一条满足条件的链,想到点分治 看到博弈,想到SG函数 然后就变成一道SG函数+点分治的题了 然后1e9的SG函数怎么搞?当然是打表了 然后各种 ...
- 【Hadoop 分布式部署 一 :分布式部署准备虚拟机 】
一.将IP配置为静态 按照 下面的操作将IP配置为静态IP 这个静态的IP地址 是你自己设置的,只要符合虚拟机的IP段就可以.最后点击 Apply 需要root密码 将网络断开 (在网络图标左键 ...
- 配置SSH无密码登录
首先进入目录 : /home/zuoyan/.ssh 在-的 .ssh 下 使用命令生成密钥 ssh-keygen -t rsa 敲4下回车 然后将公钥配置到需要的机器上,复制的目标机器最后是用户名 ...
- Shiro学习笔记四(Shiro集成WEB)
这两天由于家里出了点事情,没有准时的进行学习.今天补上之前的笔记 -----没有学不会的技术,只有不停找借口的人 学习到的知识点: 1.Shiro 集成WEB 2.基于角色的权限控制 3.基于权限的控 ...
- kubernetes 实战6_命令_Share Process Namespace between Containers in a Pod&Translate a Docker Compose File to Kubernetes Resources
Share Process Namespace between Containers in a Pod how to configure process namespace sharing for a ...
- word设置行距18磅
参考:word如何设置行距18磅 word设置行距18磅 选中需要设置的段落--"格式"菜单--段落--"缩进和间距"标签--在"行距"下拉 ...
- js实现类型jq的dom加载完成
有时候我们只想在 dom 加载完成后运行 js ,而不是等所有图片加载完成.所以不需要 onload , onload 会加载图片等其他媒体.很消耗时间. 原:http://blog.csdn.net ...
- 1.Jenkins 在windows下的安装与配置
1. 安装Jenkins 1.war包安装:启动Jenkins命令,打开cmd至Jenkins安装目录下,运行命令 java -jar jenkins.war 如果改变默认端口,则指定端口例如端口号1 ...