Django restframework 框架认证、权限、限流用法示例


Posted in Python onDecember 21, 2019

本文实例讲述了Django restframework 框架认证、权限、限流用法。分享给大家供大家参考,具体如下:

概述

Django Rest Framework 是一个强大且灵活的工具包,使用Django REST Framework可以在Django的基础上迅速实现API,用以构建Web API。

认证Authentication

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

REST_FRAMEWORK = {
 'DEFAULT_AUTHENTICATION_CLASSES': (
  'rest_framework.authentication.BasicAuthentication', # 基本认证
  'rest_framework.authentication.SessionAuthentication', # session认证
 )
}

也可以在每个视图中通过设置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 权限被禁止

权限Permissions

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

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

使用

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

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

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

'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_classess属性来配置,如

from rest_framework.throttling import UserRateThrottle
from rest_framework.views import APIView
class ExampleView(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.ScopedRateThrottle',
 ),
 'DEFAULT_THROTTLE_RATES': {
  'contacts': '1000/day',
  'uploads': '20/day'
 }
}

实例

from rest_framework.authentication import SessionAuthentication
from rest_framework.permissions import IsAuthenticated
from rest_framework.generics import RetrieveAPIView
from rest_framework.throttling import UserRateThrottle
class BookDetailView(RetrieveAPIView):
 queryset = BookInfo.objects.all()
 serializer_class = BookInfoSerializer
 authentication_classes = [SessionAuthentication]
 permission_classes = [IsAuthenticated]
 throttle_classes = (UserRateThrottle,)

希望本文所述对大家基于Django框架的Python程序设计有所帮助。

Python 相关文章推荐
scrapy爬虫完整实例
Jan 25 Python
Python实现上下班抢个顺风单脚本
Feb 07 Python
Python基于Flask框架配置依赖包信息的项目迁移部署
Mar 02 Python
python如何读写json数据
Mar 21 Python
python3+PyQt5泛型委托详解
Apr 24 Python
Python实现查找二叉搜索树第k大的节点功能示例
Jan 24 Python
详解Python3网络爬虫(二):利用urllib.urlopen向有道翻译发送数据获得翻译结果
May 07 Python
python 计算数据偏差和峰度的方法
Jun 29 Python
python笔记之mean()函数实现求取均值的功能代码
Jul 05 Python
使用python telnetlib批量备份交换机配置的方法
Jul 25 Python
PyCharm License Activation激活码失效问题的解决方法(图文详解)
Mar 12 Python
python实现简单的井字棋
May 26 Python
python支持多线程的爬虫实例
Dec 21 #Python
Python 实现try重新执行
Dec 21 #Python
在python shell中运行python文件的实现
Dec 21 #Python
Python 脚本的三种执行方式小结
Dec 21 #Python
python带参数打包exe及调用方式
Dec 21 #Python
python脚本后台执行方式
Dec 21 #Python
Python模块的制作方法实例分析
Dec 21 #Python
You might like
在PHP中设置、使用、删除Cookie的解决方法
2013/05/06 PHP
TP5框架实现自定义分页样式的方法示例
2020/04/05 PHP
自制基于jQuery的智能提示插件一枚
2011/02/18 Javascript
Jqyery中同等与js中windows.onload的应用
2011/05/10 Javascript
jQuery 自定义函数写法分享
2012/03/30 Javascript
jQuery+CSS实现菜单滑动伸展收缩(仿淘宝)
2013/03/22 Javascript
JS简单实现文件上传实例代码(无需插件)
2013/11/15 Javascript
javascript操作table(insertRow,deleteRow,insertCell,deleteCell方法详解)
2013/12/16 Javascript
利用JS判断用户是否上网(连接网络)
2013/12/23 Javascript
Javascript中3种实现继承的方法和代码实例
2014/08/12 Javascript
jQuery中prop()方法用法实例
2015/01/05 Javascript
使用EVAL处理jqchart jquery 折线图返回数据无效的解决办法
2015/11/26 Javascript
JS控制按钮10秒钟后可用的方法
2015/12/22 Javascript
最全面的JS倒计时代码
2016/09/17 Javascript
js模态对话框使用方法详解
2017/02/16 Javascript
详解nodeJS之路径PATH模块
2017/05/31 NodeJs
深入理解vue $refs的基本用法
2017/07/13 Javascript
使用Node.js实现ORM的一种思路详解(图文)
2017/10/24 Javascript
vue.js自定义组件directives的实例代码
2018/11/09 Javascript
python: 判断tuple、list、dict是否为空的方法
2018/10/22 Python
Python----数据预处理代码实例
2019/03/20 Python
Python 从subprocess运行的子进程中实时获取输出的例子
2019/08/14 Python
Django REST框架创建一个简单的Api实例讲解
2019/11/05 Python
pandas中read_csv的缺失值处理方式
2019/12/19 Python
python通过opencv实现图片裁剪原理解析
2020/01/19 Python
keras获得某一层或者某层权重的输出实例
2020/01/24 Python
阿波罗盒子:Apollo Box
2017/08/14 全球购物
Hertz荷兰:荷兰和全球租车
2018/01/07 全球购物
商务英语本科生的自我评价分享
2013/11/15 职场文书
初中生自我鉴定
2014/02/04 职场文书
宝宝满月酒主持词和仪式流程
2014/03/27 职场文书
英语三分钟演讲稿
2014/08/19 职场文书
普通党员整改措施
2014/10/24 职场文书
审美与表现自我评价
2015/03/09 职场文书
十月围城观后感
2015/06/08 职场文书
PyTorch中permute的使用方法
2022/04/26 Python