Django restframework 框架认证、权限、限流用法示例

作者:Dylan HU 时间:2023-01-17 15:51:20 

本文实例讲述了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程序设计有所帮助。

来源:https://blog.csdn.net/hzlnice/article/details/81292536

标签:Django,restframework,认证,权限
0
投稿

猜你喜欢

  • js更好地截取字符串

    2008-03-11 19:00:00
  • jupyter notebook 恢复误删单元格或者历史代码的实现

    2022-03-03 16:13:45
  • JS原型继承四步曲及原型继承图一览

    2024-06-13 14:56:04
  • 阿里云go开发环境搭建过程

    2024-04-25 15:12:31
  • Python绘制百分比堆叠柱状图并填充图案

    2023-01-25 00:49:06
  • Vuex总体案例详解

    2023-07-02 16:51:52
  • 编写Python脚本把sqlAlchemy对象转换成dict的教程

    2023-02-22 07:26:47
  • python+selenium爬取微博热搜存入Mysql的实现方法

    2024-01-24 18:07:53
  • oracle 数据库连接分析

    2009-07-28 10:42:00
  • 将一个图片以二进制值的形式存入Xml文件中

    2008-09-04 11:24:00
  • 让ASP搭配MYSQL

    2009-10-04 20:30:00
  • oracle 时间格式的调整

    2009-05-24 19:32:00
  • 使用python实现定时报天气的示例代码

    2021-12-27 14:56:10
  • Python的Pillow库进行图像文件处理(图文详解)

    2023-10-04 04:02:23
  • 超级链接中MailTo的语法

    2008-08-29 13:00:00
  • 简单谈谈Python中函数的可变参数

    2022-05-13 02:32:49
  • 七种Python代码审查工具推荐

    2021-06-16 07:07:34
  • 三谈Iframe自适应高度

    2010-08-03 13:04:00
  • 如何在C++中调用Python

    2021-05-16 23:58:41
  • JavaScript能判定两个function等价吗?

    2009-08-13 14:45:00
  • asp之家 网络编程 m.aspxhome.com