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文本特征抽取与向量化算法学习
Dec 22 Python
Python Tkinter实现简易计算器功能
Jan 30 Python
python微信好友数据分析详解
Nov 19 Python
selenium+python设置爬虫代理IP的方法
Nov 29 Python
Python简单I/O操作示例
Mar 18 Python
Python常见读写文件操作实例总结【文本、json、csv、pdf等】
Apr 15 Python
Django CSRF跨站请求伪造防护过程解析
Jul 31 Python
Python基于pip实现离线打包过程详解
May 15 Python
浅谈pytorch中torch.max和F.softmax函数的维度解释
Jun 28 Python
Python在后台自动解压各种压缩文件的实现方法
Nov 10 Python
Python爬虫中Selenium实现文件上传
Dec 04 Python
Python快速实现一键抠图功能的全过程
Jun 29 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
在Windows系统下使用PHP生成Word文档的教程
2015/07/03 PHP
ThinkPHP5.0框架使用build 自动生成模块操作示例
2019/04/11 PHP
一些易混淆且不常用的属性,希望有用
2007/01/29 Javascript
用 javascript 实现的点击复制代码
2007/03/24 Javascript
JavaScript在多浏览器下for循环的使用方法
2012/11/07 Javascript
JQuery操作三大控件(下拉,单选,复选)的方法
2013/08/06 Javascript
jQuery瀑布流插件Wookmark使用实例
2014/04/02 Javascript
JavaScript阻止事件冒泡示例分享
2014/12/28 Javascript
浅谈javascript 迭代方法
2015/01/21 Javascript
基于jQuery实现仿淘宝套餐选择插件
2015/03/04 Javascript
JavaScript通过元素索引号删除数组中对应元素的方法
2015/03/18 Javascript
纯JS前端实现分页代码
2016/06/21 Javascript
Node.js的Mongodb使用实例
2016/12/30 Javascript
JavaScript实现数组降维详解
2017/01/05 Javascript
layui选项卡效果实现代码
2017/05/19 Javascript
使用 Node.js 对文本内容分词和关键词抽取
2017/05/27 Javascript
浅谈ECMAScript6新特性之let、const
2017/08/02 Javascript
js 中rewrap-ajax.js插件实例代码
2017/10/20 Javascript
微信小程序页面间值传递的两种方法
2018/11/26 Javascript
ES6 Proxy实现Vue的变化检测问题
2019/06/11 Javascript
js中script的上下放置区别,Dom的增删改创建操作实例分析
2019/12/16 Javascript
基于ajax及jQuery实现局部刷新过程解析
2020/09/12 jQuery
js瀑布流布局的实现
2020/06/28 Javascript
解决ant-design-vue中menu菜单无法默认展开的问题
2020/10/31 Javascript
[46:25]DOTA2上海特级锦标赛主赛事日 - 4 败者组第五轮 MVP.Phx VS EG第二局
2016/03/05 DOTA
Python选择排序、冒泡排序、合并排序代码实例
2015/04/10 Python
Python网站验证码识别
2016/01/25 Python
python中实现数组和列表读取一列的方法
2018/04/03 Python
python提取图像的名字*.jpg到txt文本的方法
2018/05/10 Python
Python通过paramiko远程下载Linux服务器上的文件实例
2018/12/27 Python
opencv python图像梯度实例详解
2020/02/04 Python
jupyter notebook 恢复误删单元格或者历史代码的实现
2020/04/17 Python
pymysql模块使用简介与示例
2020/11/17 Python
6种非常炫酷的CSS3按钮边框动画特效
2016/03/16 HTML / CSS
澳大利亚工具仓库:Tools Warehouse
2018/10/15 全球购物
业务代表的岗位职责
2013/11/16 职场文书