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获得一个月有多少天的方法
Jun 04 Python
Python设计实现的计算器功能完整实例
Aug 18 Python
python中将函数赋值给变量时需要注意的一些问题
Aug 18 Python
详谈Python中列表list,元祖tuple和numpy中的array区别
Apr 18 Python
python爬取足球直播吧五大联赛积分榜
Jun 13 Python
Python中字符串与编码示例代码
May 20 Python
使用pandas读取文件的实现
Jul 31 Python
Python 在OpenCV里实现仿射变换—坐标变换效果
Aug 30 Python
tensorflow 自定义损失函数示例代码
Feb 05 Python
Python网络爬虫信息提取mooc代码实例
Mar 06 Python
关于python3.7安装matplotlib始终无法成功的问题的解决
Jul 28 Python
Python生成pdf目录书签的实例方法
Oct 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
修改apache配置文件去除thinkphp url中的index.php
2014/01/17 PHP
php简单实现多字节字符串翻转的方法
2015/03/31 PHP
PHP微信开发之有道翻译
2016/06/23 PHP
PHP实现基于状态的责任链审批模式详解
2019/05/31 PHP
JS window.opener返回父页面的应用
2009/10/24 Javascript
JS实现的省份级联实例代码
2013/06/24 Javascript
页面图片浮动左右滑动效果的简单实现案例
2014/02/10 Javascript
更快的异步执行(setTimeout多浏览器)
2014/08/12 Javascript
JS实现样式清新的横排下拉菜单效果
2015/10/09 Javascript
javascript 中的 delete及delete运算符
2015/11/15 Javascript
jQuery插件zTree实现获取一级节点数据的方法
2017/03/08 Javascript
浅谈JS封闭函数、闭包、内置对象
2017/07/18 Javascript
javascript 中select框触发事件过程的分析
2017/08/01 Javascript
vue实现记事本功能
2019/06/26 Javascript
js设计模式之单例模式原理与用法详解
2019/08/15 Javascript
对layui初始化列表的CheckBox属性详解
2019/09/13 Javascript
vue中activated的用法
2021/01/03 Vue.js
Python中字符编码简介、方法及使用建议
2015/01/08 Python
使用Python保存网页上的图片或者保存页面为截图
2016/03/05 Python
selenium+python实现1688网站验证码图片的截取功能
2018/08/14 Python
python Gunicorn服务器使用方法详解
2019/07/22 Python
Python实现上下文管理器的方法
2020/08/07 Python
python用分数表示矩阵的方法实例
2021/01/11 Python
使用HTML5捕捉音频与视频信息概述及实例
2018/08/22 HTML / CSS
html5 canvas 实现光线沿不规则路径运动
2020/04/20 HTML / CSS
Claire’s法国:时尚配饰、美容、珠宝、头发
2021/01/16 全球购物
大四学年自我鉴定
2013/11/13 职场文书
网络专业学生个人的自我评价
2013/12/16 职场文书
护士毕业实习感言
2014/03/05 职场文书
授权收款委托书范本
2014/10/10 职场文书
2014年健康教育工作总结
2014/11/20 职场文书
最美乡村教师观后感
2015/06/11 职场文书
学生退学证明
2015/06/23 职场文书
欢送会主持词
2015/07/01 职场文书
学校食堂管理制度
2015/08/04 职场文书
Java8中Stream的一些神操作
2021/11/02 Java/Android