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 相关文章推荐
利用Python和OpenCV库将URL转换为OpenCV格式的方法
Mar 27 Python
Python常见异常分类与处理方法
Jun 04 Python
利用Tkinter(python3.6)实现一个简单计算器
Dec 21 Python
批量将ppt转换为pdf的Python代码 只要27行!
Feb 26 Python
图解Python变量与赋值
Apr 03 Python
Python+selenium 获取浏览器窗口坐标、句柄的方法
Oct 14 Python
python如何将多个PDF进行合并
Aug 13 Python
如何验证python安装成功
Jul 06 Python
使用PyCharm安装pytest及requests的问题
Jul 31 Python
Pycharm中使用git进行合作开发的教程详解
Nov 17 Python
python制作图形界面的2048游戏, 基于tkinter
Apr 06 Python
pandas中pd.groupby()的用法详解
Jun 16 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 curl请求信息和返回信息设置代码实例
2015/04/27 PHP
php封装的验证码类分享
2017/02/26 PHP
PHP中的Iterator迭代对象属性详解
2019/04/12 PHP
jQuery的实现原理的模拟代码 -1 核心部分
2010/08/01 Javascript
JavaScript格式化数字的函数代码
2010/11/30 Javascript
scrollWidth,clientWidth,offsetWidth的区别
2015/01/13 Javascript
BootStrap中的表单大全
2016/09/07 Javascript
JavaScript实现url参数转成json形式
2016/09/25 Javascript
ES5学习教程之Array对象
2017/04/01 Javascript
ng-repeat指令在迭代对象时的去重方法
2018/10/02 Javascript
Js 利用正则表达式和replace函数获取string中所有被匹配到的文本(推荐)
2018/10/28 Javascript
JQuery判断radio单选框是否选中并获取值的方法
2019/01/17 jQuery
JS实现将对象转化为数组的方法分析
2019/01/21 Javascript
js设置默认时间跨度过程详解
2019/07/17 Javascript
js实现计算器功能
2020/08/10 Javascript
vue实现登录功能
2020/12/31 Vue.js
原生JavaScript实现幻灯片效果
2021/02/19 Javascript
深入理解Python分布式爬虫原理
2017/11/23 Python
python二维列表一维列表的互相转换实例
2018/07/02 Python
Python基于plotly模块实现的画图操作示例
2019/01/23 Python
python下载微信公众号相关文章
2019/02/26 Python
python获取引用对象的个数方式
2019/12/20 Python
python使用paramiko实现ssh的功能详解
2020/03/06 Python
python向企业微信发送文字和图片消息的示例
2020/09/28 Python
Python3+Flask安装使用教程详解
2021/02/16 Python
CSS3实现时间轴特效
2020/11/02 HTML / CSS
台湾森森购物网:U-mall
2017/10/16 全球购物
英国最好的温室之家:Greenhouses Direct
2019/07/13 全球购物
欧姆龙医疗保健与医疗产品:Omron Healthcare
2020/02/10 全球购物
师德师风个人整改措施
2014/10/27 职场文书
2015年个人实习工作总结
2015/05/28 职场文书
sqlserver连接错误之SQL评估期已过的问题解决
2022/03/23 SQL Server
MongoDB误操作后使用oplog恢复数据
2022/04/11 MongoDB
排查并解决MySQL生产库内存使用率高的报警
2022/04/11 MySQL
Python使用Web框架Flask开发项目
2022/06/01 Python
Nginx跨域问题解析与解决
2022/08/05 Servers