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 18 Python
基于Python的关键字监控及告警
Jul 06 Python
Python编程实现蚁群算法详解
Nov 13 Python
浅谈python装饰器探究与参数的领取
Dec 01 Python
python与caffe改变通道顺序的方法
Aug 04 Python
win10下tensorflow和matplotlib安装教程
Sep 19 Python
使用python itchat包爬取微信好友头像形成矩形头像集的方法
Feb 21 Python
为什么从Python 3.6开始字典有序并效率更高
Jul 15 Python
Python SSL证书验证问题解决方案
Jan 13 Python
Python Selenium 设置元素等待的三种方式
Mar 18 Python
用python实现学生管理系统
Jul 24 Python
Python+Appium实现自动抢微信红包
May 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中计算时间差的几种方法
2009/12/31 PHP
php关于array_multisort多维数组排序的使用说明
2011/01/04 PHP
深入php socket的讲解与实例分析
2013/06/13 PHP
解决ThinkPHP关闭调试模式时报错的问题汇总
2015/04/22 PHP
PHP实现数据库的增删查改功能及完整代码
2018/04/18 PHP
PHP聊天室简单实现方法详解
2018/12/08 PHP
php实现映射操作实例详解
2019/10/02 PHP
javascript 单例/单体模式(Singleton)
2011/04/07 Javascript
javascript真的不难-回顾一下基础知识
2013/01/15 Javascript
jquery和ajax的关系详细介绍
2013/11/29 Javascript
js charAt的使用示例
2014/02/18 Javascript
详解js闭包
2014/09/02 Javascript
使用js画图之圆、弧、扇形
2015/01/12 Javascript
jquery表单验证插件(jquery.validate.js)的3种使用方式
2015/03/28 Javascript
jquery实现点击label的同时触发文本框点击事件的方法
2015/06/05 Javascript
如何使用Bootstrap的modal组件自定义alert,confirm和modal对话框
2016/03/01 Javascript
Backbone.js框架中Model与Collection的使用实例
2016/05/07 Javascript
jQuery制作圣诞主题页面 更像是爱情影集
2016/08/10 Javascript
100行代码理解和分析vue2.0响应式架构
2017/03/09 Javascript
Jquery中.bind()、.live()、.delegate()和.on()之间的区别详解
2017/08/01 jQuery
微信小程序实现之手势锁功能实例代码
2018/07/19 Javascript
微信实现自动跳转到用其他浏览器打开指定APP下载
2019/02/15 Javascript
[07:08]2014DOTA2西雅图国际邀请赛 小组赛7月11日TOPPLAY
2014/07/11 DOTA
python输入错误密码用户锁定实现方法
2017/11/27 Python
使用NumPy和pandas对CSV文件进行写操作的实例
2018/06/14 Python
Python可迭代对象操作示例
2019/05/07 Python
python中sklearn的pipeline模块实例详解
2020/05/21 Python
如何学习Python time模块
2020/06/03 Python
sklearn和keras的数据切分与交叉验证的实例详解
2020/06/19 Python
如何使用python记录室友的抖音在线时间
2020/06/29 Python
加热夹克:RAVEAN
2018/10/19 全球购物
编码实现字符串转整型的函数
2012/06/02 面试题
交通工程专业推荐信
2014/09/06 职场文书
群众路线教育实践活动批评与自我批评
2014/09/15 职场文书
写给孩子的新学期寄语
2015/02/27 职场文书
李强感恩观后感
2015/06/17 职场文书