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目录与文件名操作例子
Aug 28 Python
mysql 之通过配置文件链接数据库
Aug 12 Python
Python键盘输入转换为列表的实例
Jun 23 Python
Python并行分布式框架Celery详解
Oct 15 Python
详解10个可以快速用Python进行数据分析的小技巧
Jun 24 Python
python脚本当作Linux中的服务启动实现方法
Jun 28 Python
基于Python函数和变量名解析
Jul 19 Python
python修改FTP服务器上的文件名
Sep 11 Python
基于python实现微信好友数据分析(简单)
Feb 16 Python
Python实现队列的方法示例小结【数组,链表】
Feb 22 Python
Python 序列化和反序列化库 MarshMallow 的用法实例代码
Feb 25 Python
pycharm远程连接vagrant虚拟机中mariadb数据库
Jun 05 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边学边教》(02.Apache+PHP环境配置――上篇)
2006/12/13 PHP
PHP数组排序函数合集 以及它们之间的联系分析
2013/06/27 PHP
ThinkPHP自动转义存储富文本编辑器内容导致读取出错的解决方法
2014/08/08 PHP
Thinkphp5框架简单实现钩子(Hook)行为的方法示例
2019/09/03 PHP
capacityFixed 基于jquery的类似于新浪微博新消息提示的定位框
2011/05/24 Javascript
nodejs实现获取当前url地址及url各种参数值
2015/06/25 NodeJs
JS+CSS实现的经典tab选项卡效果代码
2015/09/16 Javascript
微信小程序 开发之顶部导航栏实例代码
2017/02/23 Javascript
iscroll实现下拉刷新功能
2017/07/18 Javascript
浅谈vue-lazyload实现的详细过程
2017/08/22 Javascript
VSCode中如何利用d.ts文件进行js智能提示
2018/04/13 Javascript
jQuery实现DIV响应鼠标滑过由下向上展开效果示例【测试可用】
2018/04/26 jQuery
vue-cli3.0配置及使用注意事项详解
2018/09/05 Javascript
小程序指纹验证的实现代码
2018/12/04 Javascript
详解auto-vue-file:一个自动创建vue组件的包
2019/04/26 Javascript
node.js使用yargs处理命令行参数操作示例
2020/02/11 Javascript
Vue登录拦截 登录后继续跳转指定页面的操作
2020/08/04 Javascript
详解Python中for循环的使用方法
2015/05/14 Python
python消除序列的重复值并保持顺序不变的实例
2018/11/08 Python
Python实现爬取亚马逊数据并打印出Excel文件操作示例
2019/05/16 Python
Python基础学习之类与实例基本用法与注意事项详解
2019/06/17 Python
Python Web框架之Django框架文件上传功能详解
2019/08/16 Python
python多进程(加入进程池)操作常见案例
2019/10/21 Python
Python基于requests实现模拟上传文件
2020/04/21 Python
Python 获取异常(Exception)信息的几种方法
2020/12/29 Python
HTML5 Video标签的属性、方法和事件汇总介绍
2015/04/24 HTML / CSS
美国农场鲜花速递:The Bouqs
2018/07/13 全球购物
Everything But Water官网:美国泳装品牌
2019/03/17 全球购物
MIXIT官网:俄罗斯最大的化妆品公司之一
2020/01/25 全球购物
高中毕业自我鉴定范文
2013/10/02 职场文书
领导班子自我剖析材料
2014/08/16 职场文书
2014年营业员工作总结
2014/11/18 职场文书
盗窃罪辩护词范文
2015/05/21 职场文书
多表查询、事务、DCL
2021/04/05 MySQL
改造DE1103三步曲
2022/04/07 无线电
如何让你的Nginx支持分布式追踪详解
2022/07/07 Servers