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中几种操作字符串的方法的介绍
Apr 09 Python
简单了解Django模板的使用
Dec 20 Python
pandas把dataframe转成Series,改变列中值的类型方法
Apr 10 Python
PyQt5每天必学之事件与信号
Apr 20 Python
Python列表删除元素del、pop()和remove()的区别小结
Sep 11 Python
Pytorch之卷积层的使用详解
Dec 31 Python
Tensorflow:转置函数 transpose的使用详解
Feb 11 Python
Python闭包及装饰器运行原理解析
Jun 17 Python
在keras中对单一输入图像进行预测并返回预测结果操作
Jul 09 Python
Python如何执行精确的浮点数运算
Jul 31 Python
Python数据清洗工具之Numpy的基本操作
Apr 22 Python
Python实现socket库网络通信套接字
Jun 04 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
咖啡常见的种类
2021/03/03 新手入门
将数组写入txt文件 var_export
2009/04/21 PHP
phpExcel导出大量数据出现内存溢出错误的解决方法
2013/02/28 PHP
ThinkPHP开发--使用七牛云储存
2017/09/14 PHP
jquery下将选择的checkbox的id组成字符串的方法
2010/11/28 Javascript
增强用户体验友好性之jquery easyui window 窗口关闭时的提示
2012/06/22 Javascript
禁用Tab键JS代码兼容Firefox和IE
2014/04/18 Javascript
jquery操作复选框checkbox的方法汇总
2015/02/05 Javascript
详解AngularJS中module模块的导入导出
2015/12/10 Javascript
Javascript 基础---Ajax入门必看
2016/07/06 Javascript
bootstrap table 表格中增加下拉菜单末行出现滚动条的快速解决方法
2017/01/05 Javascript
vue基于mint-ui的城市选择3级联动的示例
2017/10/25 Javascript
jQuery实现的简单图片轮播效果完整示例
2018/02/08 jQuery
layui操作列按钮个数和文字颜色的判断实例
2019/09/11 Javascript
layui 解决富文本框form表单提交为空的问题
2019/10/26 Javascript
原生JS利用transform实现banner的无限滚动示例代码
2020/06/15 Javascript
删除目录下相同文件的python代码(逐级优化)
2012/05/25 Python
Python Django使用forms来实现评论功能
2016/08/17 Python
python向已存在的excel中新增表,不覆盖原数据的实例
2018/05/02 Python
Python3 jupyter notebook 服务器搭建过程
2018/11/30 Python
关于Python核心框架tornado的异步协程的2种方法详解
2019/08/28 Python
基于Django统计博客文章阅读量
2019/10/29 Python
pytorch sampler对数据进行采样的实现
2019/12/31 Python
Django ORM判断查询结果是否为空,判断django中的orm为空实例
2020/07/09 Python
html5中地理位置定位api接口开发应用小结
2013/01/04 HTML / CSS
基于HTML5 FileSystem API的使用介绍
2013/04/24 HTML / CSS
科茨沃尔德家居商店:Scotts of Stow
2018/06/29 全球购物
英国最大的在线快递公司之一:ParcelHero
2019/11/04 全球购物
毕业生个人求职的自我评价
2013/10/28 职场文书
股份合作协议书范本
2014/04/14 职场文书
中学生家长评语大全
2014/04/16 职场文书
平安建设工作方案
2014/06/02 职场文书
小学国庆节活动方案策划书
2014/09/16 职场文书
关于React Native 无法链接模拟器的问题
2021/06/21 Javascript
在项目中使用redis做缓存的一些思路
2021/09/14 Redis
Python PIL按比例裁剪图片
2022/05/11 Python