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 相关文章推荐
Python3连接MySQL(pymysql)模拟转账实现代码
May 24 Python
Python数据结构与算法之列表(链表,linked list)简单实现
Oct 30 Python
Python实现中一次读取多个值的方法
Apr 22 Python
python format 格式化输出方法
Jul 16 Python
Python从ZabbixAPI获取信息及实现Zabbix-API 监控的方法
Sep 17 Python
python实现爬取百度图片的方法示例
Jul 06 Python
python基于paramiko将文件上传到服务器代码实现
Jul 08 Python
python flask几分钟实现web服务的例子
Jul 26 Python
感知器基础原理及python实现过程详解
Sep 30 Python
python框架django项目部署相关知识详解
Nov 04 Python
django queryset相加和筛选教程
May 18 Python
属性与 @property 方法让你的python更高效
Sep 21 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数据库连接
2006/10/09 PHP
基于PHP 面向对象之成员方法详解
2013/05/04 PHP
smarty内置函数config_load用法实例
2015/01/22 PHP
php上传图片生成缩略图(GD库)
2016/01/06 PHP
Prototype Template对象 学习
2009/07/19 Javascript
js类的静态属性和实例属性的理解
2009/10/01 Javascript
javascript之学会吝啬 精简代码
2010/04/25 Javascript
js原型链原理看图说明
2012/07/07 Javascript
纯js实现瀑布流展现照片(自动适应窗口大小)
2013/04/08 Javascript
jquery结婚电子请柬特效源码分享
2015/08/21 Javascript
原生JS中slice()方法和splice()区别
2017/03/06 Javascript
Bootstrap模态框插件使用详解
2017/05/11 Javascript
基于node打包可执行文件工具_Pkg使用心得分享
2018/01/24 Javascript
微信小程序实现按字母排列选择城市功能
2019/11/25 Javascript
vue+vant使用图片预览功能ImagePreview的问题解决
2020/04/10 Javascript
解决vue动态路由异步加载import组件,加载不到module的问题
2020/07/26 Javascript
[51:29]Alliance vs TNC 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/18 DOTA
python中global与nonlocal比较
2014/11/21 Python
python实现将内容分行输出
2015/11/05 Python
对python csv模块配置分隔符和引用符详解
2018/12/12 Python
python web自制框架之接受url传递过来的参数实例
2018/12/17 Python
Djang的model创建的字段和参数详解
2019/07/27 Python
在 Linux/Mac 下为Python函数添加超时时间的方法
2020/02/20 Python
python获取本周、上周、本月、上月及本季的时间代码实例
2020/09/08 Python
css3 border-radius属性详解
2017/07/05 HTML / CSS
HTML5中的Scoped属性使用实例
2014/04/23 HTML / CSS
使用纯HTML5编写一款网页上的时钟的代码分享
2015/11/16 HTML / CSS
会计实习生工作总结的自我评价
2013/10/07 职场文书
热能动力工程毕业生自荐信
2013/11/07 职场文书
挂职思想汇报
2013/12/31 职场文书
民族团结先进个人材料
2014/02/05 职场文书
优秀党员学习焦裕禄精神思想汇报范文
2014/09/10 职场文书
党员领导干部民主生活会批评与自我批评发言
2014/09/28 职场文书
网络妈妈观后感
2015/06/08 职场文书
入学证明
2015/06/23 职场文书
分享:关于学习的励志名言赏析
2019/08/16 职场文书