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编程中基本的数学计算使用
Feb 04 Python
python使用正则表达式匹配字符串开头并打印示例
Jan 11 Python
python用Pygal如何生成漂亮的SVG图像详解
Feb 10 Python
Ubuntu 下 vim 搭建python 环境 配置
Jun 12 Python
Python pyinotify日志监控系统处理日志的方法
Mar 08 Python
Python根据已知邻接矩阵绘制无向图操作示例
Jun 23 Python
python将pandas datarame保存为txt文件的实例
Feb 12 Python
Python I/O与进程的详细讲解
Mar 08 Python
python抓取搜狗微信公众号文章
Apr 01 Python
详解pyqt5的UI中嵌入matplotlib图形并实时刷新(挖坑和填坑)
Aug 07 Python
Python 删除List元素的三种方法remove、pop、del
Nov 16 Python
解决pytorch 的state_dict()拷贝问题
Mar 03 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
《魔兽争霸3:重制版》翻车了?你想要的我们都没有
2019/11/07 魔兽争霸
咖啡磨器 如何选购一台适合家用的意式磨豆机
2021/03/05 新手入门
php tp验证表单与自动填充函数代码
2012/02/22 PHP
php调用mysql存储过程实例分析
2014/12/29 PHP
php+xml编程之SimpleXML的应用实例
2015/01/24 PHP
php正则表达式获取内容所有链接
2015/07/24 PHP
php和asp语法上的区别总结
2019/05/12 PHP
网页里控制图片大小的相关代码
2006/06/25 Javascript
Javascript 类、命名空间、代码组织代码
2011/07/31 Javascript
网页运行时提示对象不支持abigimage属性或方法
2014/08/10 Javascript
window.onload绑定多个事件的两种解决方案
2016/05/15 Javascript
AngularJS基础 ng-show 指令简单示例
2016/08/03 Javascript
利用Angularjs和bootstrap实现购物车功能
2016/08/31 Javascript
CodeMirror js代码加亮使用总结
2017/03/25 Javascript
详解Vuejs2.0之异步跨域请求
2017/04/20 Javascript
JavaScript引用类型RegExp基本用法详解
2018/08/09 Javascript
javascript 设计模式之享元模式原理与应用详解
2020/04/08 Javascript
Python编程实现的简单Web服务器示例
2017/06/22 Python
Python实现的视频播放器功能完整示例
2018/02/01 Python
基于循环神经网络(RNN)实现影评情感分类
2018/03/26 Python
django框架CSRF防护原理与用法分析
2019/07/22 Python
pip install python 快速安装模块的教程图解
2019/10/08 Python
Python random库使用方法及异常处理方案
2020/03/02 Python
selenium WebDriverWait类等待机制的实现
2020/03/18 Python
python实现定时发送邮件
2020/12/23 Python
CSS3轻松实现圆角效果
2017/11/09 HTML / CSS
借助HTML5 Canvas API制作一个简单的猜字游戏
2016/03/25 HTML / CSS
HTML5 新表单类型示例代码
2018/03/20 HTML / CSS
史蒂夫·马登加拿大官网:Steve Madden加拿大
2017/11/18 全球购物
大学应届毕业生个人求职信
2013/09/23 职场文书
会计实习期自我鉴定
2013/10/06 职场文书
酒店公关部经理岗位职责
2013/11/24 职场文书
《美丽的小兴安岭》教学反思
2014/02/26 职场文书
警察先进个人事迹材料
2014/05/16 职场文书
信电学院毕业生自荐书
2014/05/24 职场文书
超市创意活动方案
2014/08/15 职场文书