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安装以及IDE的配置教程
Apr 29 Python
详解Django框架中用context来解析模板的方法
Jul 20 Python
在主机商的共享服务器上部署Django站点的方法
Jul 22 Python
VTK与Python实现机械臂三维模型可视化详解
Dec 13 Python
浅析PHP与Python进行数据交互
May 15 Python
PyCharm在新窗口打开项目的方法
Jan 17 Python
python 切换root 执行命令的方法
Jan 19 Python
详解python3中用HTMLTestRunner.py报ImportError: No module named 'StringIO'如何解决
Aug 27 Python
检测tensorflow是否使用gpu进行计算的方式
Feb 03 Python
学习Python爬虫的几点建议
Aug 05 Python
python中threading和queue库实现多线程编程
Feb 06 Python
python 机器学习的标准化、归一化、正则化、离散化和白化
Apr 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求今天、昨天、明天时间戳的简单实现方法
2016/07/28 PHP
Prototype Function对象 学习
2009/07/12 Javascript
jquery 读取页面load get post ajax 四种方式代码写法
2011/04/02 Javascript
JavaScript实现的encode64加密算法实例分析
2015/04/15 Javascript
理解JS绑定事件
2016/01/19 Javascript
浅谈JavaScript 浏览器对象
2016/06/03 Javascript
Javascript 调用 ActionScript 的简单方法
2016/09/22 Javascript
基于chosen插件实现人员选择树搜索自动筛选功能
2016/09/24 Javascript
Javascript 实现微信分享(QQ、朋友圈、分享给朋友)
2016/10/21 Javascript
基于Bootstrap和jQuery构建前端分页工具实例代码
2016/11/23 Javascript
深入浅析javascript继承体系
2017/10/23 Javascript
nodejs前端模板引擎swig入门详解
2018/05/15 NodeJs
Vue2.x通用编辑组件的封装及应用详解
2019/05/28 Javascript
javascript中contains是否包含功能实现代码(扩展字符、数组、dom)
2020/04/07 Javascript
Python使用multiprocessing创建进程的方法
2015/06/04 Python
Python实现获取本地及远程图片大小的方法示例
2018/07/21 Python
使用PIL(Python-Imaging)反转图像的颜色方法
2019/01/24 Python
python生成word合同的实例方法
2021/01/12 Python
利用纯CSS3实现文字向右循环闪过效果实例(可用于移动端)
2017/06/15 HTML / CSS
L*SPACE官网:比基尼、泳装和度假服装
2019/03/18 全球购物
J2EE中常用的名词进行解释
2015/11/09 面试题
信息系统专业个人求职信范文
2013/12/07 职场文书
咖啡店的创业计划书,让你hold不住
2014/01/03 职场文书
建筑经济管理专业求职信分享
2014/01/06 职场文书
《都江堰》教学反思
2014/02/07 职场文书
客户接待方案
2014/02/26 职场文书
青蓝工程实施方案
2014/03/27 职场文书
企业法人任命书
2015/09/21 职场文书
2016年国培研修日志
2015/11/13 职场文书
小学教师教学反思
2016/02/24 职场文书
Python 循环读取数据内存不足的解决方案
2021/05/25 Python
MySQL数据库必备之条件查询语句
2021/10/15 MySQL
Go语言基础切片的创建及初始化示例详解
2021/11/17 Golang
JavaScript模拟实现网易云轮播效果
2022/04/04 Javascript
vue 自定义组件添加原生事件
2022/04/21 Vue.js
Python 中面向接口编程
2022/05/20 Python