Django REST framework - 权限和限制

目录

  • Django REST framework 权限和限制

    • (你能干什么)
    • 设置权限的方法
    • 案例
      • 第一步: 定义一个权限类
      • 第二步: 使用
      • 视图级别
      • 全局级别设置
    • ---
    • 限制
      • (你一分钟能干多少次?)**好像有点污~~ ###
      • 第一步: 自定义限制类
      • 第二步: 使用
      • 嫌麻烦的话,还可以使用内置限制类,哈哈~

Django REST framework 权限和限制

(你能干什么)

与身份验证和限制一起,权限确定是应该授予还是拒绝访问请求。

在允许任何其他代码继续之前,权限检查始终在视图的最开始运行。权限检查通常使用 request.userrequest.auth 属性中的身份验证信息来确定是否应允许传入请求。

权限用于授予或拒绝不同类别的用户访问API的不同部分。

最简单的权限类型是允许访问任何经过身份验证的用户,并拒绝访问任何未经身份验证的用户。这对应IsAuthenticated于REST框架中的类。

稍微不那么严格的权限样式是允许对经过身份验证的用户进行完全访问,但允许对未经身份验证的用户进行只读访问。这对应IsAuthenticatedOrReadOnly于REST框架中的类。

设置权限的方法

  1. 可以使用该DEFAULT_PERMISSION_CLASSES设置全局设置默认权限策略。例如:

     REST_FRAMEWORK = {
         'DEFAULT_PERMISSION_CLASSES': (
                 'rest_framework.permissions.IsAuthenticated',
         )
     }

    如果未指定,则此设置默认允许不受限制的访问:

     'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.AllowAny',
     )
  2. 您还可以使用APIView基于类的视图在每个视图或每个视图集的基础上设置身份验证策略。

    from rest_framework.permissions import IsAuthenticated
    from rest_framework.response import Response
    from rest_framework.views import APIView

    class ExampleView(APIView):
    permission_classes = (IsAuthenticated,)

     def get(self, request, format=None):
         content = {
             'status': 'request was permitted'
         }
         return Response(content)
  3. 或者,使用@api_view具有基于功能的视图的装饰器。
     from rest_framework.decorators import api_view, permission_classes
     from rest_framework.permissions import IsAuthenticated
     from rest_framework.response import Response
    
     @api_view(['GET'])
     @permission_classes((IsAuthenticated, ))
     def example_view(request, format=None):
         content = {
             'status': 'request was permitted'
         }
         return Response(content)

注意 :当您通过类属性或装饰器设置新的权限类时,您告诉视图忽略settings.py文件中的默认列表集。

如果它们继承自rest_framework.permissions.BasePermission,则可以使用标准Python按位运算符组合权限。例如,IsAuthenticatedOrReadOnly可以写成:

from rest_framework.permissions import BasePermission, IsAuthenticated, SAFE_METHODS
from rest_framework.response import Response
from rest_framework.views import APIView

class ReadOnly(BasePermission):
    def has_permission(self, request, view):
        return request.method in SAFE_METHODS

class ExampleView(APIView):
    permission_classes = (IsAuthenticated|ReadOnly,)

    def get(self, request, format=None):
        content = {
            'status': 'request was permitted'
        }
        return Response(content)

案例

此案例基于 Django REST framework 认证

第一步: 定义一个权限类

"""

自己动手写一个权限组件
"""
from rest_framework.permissions import BasePermission

class MyPermission(BasePermission):

message = '只有VIP才能访问'

def has_permission(self, request, view):
    # 认证类中返回了token_obj.user, request_token
    # request.auth 等价于request_token
    if not request.auth:
        return False
    # request.user为当前用户对象
    if request.user and request.user.type == 1:  # 如果是VIP用户
        print("requ", request.user, type(request.user))
        return True
    else:
        return False

第二步: 使用

视图级别

class CommentViewSet(ModelViewSet):

    queryset = models.Comment.objects.all()
    serializer_class = app01_serializers.CommentSerializer
    authentication_classes = [MyAuth, ]
    permission_classes = [MyPermission, ]

全局级别设置

# 在settings.py中设置rest framework相关配置项
REST_FRAMEWORK = {
    "DEFAULT_AUTHENTICATION_CLASSES": ["app01.utils.MyAuth", ],
    "DEFAULT_PERMISSION_CLASSES": ["app01.utils.MyPermission", ]
}

---


限制

(你一分钟能干多少次?)**好像有点污~~ ###

第一步: 自定义限制类

import time

# from rest_framework.throttling import
visit_record = {}

class MyThrottle(object):

def __init__(self):
    self.history = None

def allow_request(self, request, view):
    # 拿到当前的请求的ip作为访问记录的 key
    ip = request.META.get('REMOTE_ADDR')
    # 拿到当前请求的时间戳
    now = time.time()
    if ip not in visit_record:
        visit_record[ip] = []
    # 把当前请求的访问记录拿出来保存到一个变量中
    history = visit_record[ip]
    self.history = history
    # 循环访问历史,把超过10秒钟的请求时间去掉
    while history and now - history[-1] > 10:
        history.pop()
    # 此时 history中只保存了最近10秒钟的访问记录
    if len(history) >= 3:
        return False
    else:
        # 判断之前有没有访问记录(第一次来)
        self.history.insert(0, now)
        return True

def wait(self):
    """告诉客户端还需等待多久"""
    now = time.time()
    return self.history[-1] + 10 - now

# history = ['9:56:12', '9:56:10', '9:56:09', '9:56:08']  # '9:56:18' - '9:56:12'

# history = ['9:56:19', '9:56:18', '9:56:17', '9:56:08']

# 最后一项到期的时间就是下一次允许请求的时间

# 最后一项到期的时间:now - history[-1] > 10

# 最后一项还剩多少时间过期
# history[-1] + 10 - now

第二步: 使用

视图中使用

class CommentViewSet(ModelViewSet):

    queryset = models.Comment.objects.all()
    serializer_class = app01_serializers.CommentSerializer
    throttle_classes = [MyThrottle, ]

全局中使用

# 在settings.py中设置rest framework相关配置项
REST_FRAMEWORK = {
    "DEFAULT_AUTHENTICATION_CLASSES": ["app01.utils.MyAuth", ],
    "DEFAULT_PERMISSION_CLASSES": ["app01.utils.MyPermission", ]
    "DEFAULT_THROTTLE_CLASSES": ["app01.utils.MyThrottle", ]
}

嫌麻烦的话,还可以使用内置限制类,哈哈~

from rest_framework.throttling import SimpleRateThrottle

class VisitThrottle(SimpleRateThrottle):

    scope = "xxx"

    def get_cache_key(self, request, view):
        return self.get_ident(request)

全局配置

# 在settings.py中设置rest framework相关配置项
REST_FRAMEWORK = {
    "DEFAULT_AUTHENTICATION_CLASSES": ["app01.utils.MyAuth", ],
    # "DEFAULT_PERMISSION_CLASSES": ["app01.utils.MyPermission", ]
    "DEFAULT_THROTTLE_CLASSES": ["app01.utils.VisitThrottle", ],
    "DEFAULT_THROTTLE_RATES": {
        "xxx": "5/m",
    }
}

原文地址:https://www.cnblogs.com/konghui/p/10351911.html

时间: 2024-08-29 11:53:58

Django REST framework - 权限和限制的相关文章

Django rest framework ---- 权限

Django rest framework ---- 权限 添加权限 api/utils文件夹下新建premission.py文件,代码如下: message是当没有权限时,提示的信息 # FileName : permission.py # Author : Adil # DateTime : 2019/7/30 5:14 PM # SoftWare : PyCharm from rest_framework.permissions import BasePermission class SV

Django REST framework —— 权限组件源码分析

在上一篇文章中我们已经分析了认证组件源码,我们再来看看权限组件的源码,权限组件相对容易,因为只需要返回True 和False即可 代码 1 class ShoppingCarView(ViewSetMixin, APIView): 2 permission_classes = [MyPermission, ] 3 def list(self,request, *args, **kwargs): 4 """ 5 查看购物车信息 6 :param args: 7 :param k

Django rest framework 权限操作(源码分析二)

知识回顾 这一篇是基于上一篇写的,上一篇谢了认证的具体流程,看懂了上一篇这一篇才能看懂, 当用户访问是 首先执行dispatch函数,当执行当第二部时: #2.处理版本信息 处理认证信息 处理权限信息 对用户的访问频率进行限制 self.initial(request, *args, **kwargs) 进入到initial方法: def initial(self, request, *args, **kwargs): """ Runs anything that needs

Django Restful Framework【第三篇】认证、权限、限制访问频率

一.认证 认证请求头 views.py #!/usr/bin/env python # -*- coding:utf-8 -*- from rest_framework.views import APIView from rest_framework.response import Response from rest_framework.authentication import BaseAuthentication from rest_framework.permissions import

Django Rest Framework源码剖析(二)-----权限

一.简介 在上一篇博客中已经介绍了django rest framework 对于认证的源码流程,以及实现过程,当用户经过认证之后下一步就是涉及到权限的问题.比如订单的业务只能VIP才能查看,所以这时候需要对权限进行控制.下面将介绍DRF的权限控制源码剖析. 二.基本使用 这里继续使用之前的示例,加入相应的权限,这里先介绍使用示例,然后在分析权限源码 1.在django 项目下新建立目录utils,并建立permissions.py,添加权限控制: class MyPremission(obje

Django Rest framework 之 权限

一.权限实例 在阅读本文之前请先参考django rest framework 之 认证中关于django rest framework的相关内容及实例 1.目录结构 为了更好的管理各个功能组件,在django rest framework 之 认证中我们说到可以将认证类单独的拿出来,放到其他目录下,然后导入到views.py 文件中,在权限环节我们亦可以这么做,目录结构就变成这样 在api这个app下创建一个utils包专门用来存放相关的组件. 2.为模型类添加认证字段 我们在models.p

利用 Django REST framework 编写 RESTful API

利用 Django REST framework 编写 RESTful API Updateat 2015/12/3: 增加 filter 最近在玩 Django,不得不说 rest_framework 真乃一大神器,可以轻易的甚至自动化的搞定很多事情,比如: 自动生成符合 RESTful 规范的 API 支持 OPTION.HEAD.POST.GET.PATCH.PUT.DELETE 根据 Content-Type 来动态的返回数据类型(如 text.json) 生成 browserable

Python【第二十四课】Django rest framework

本节内容 Django rest framework 安装 Django rest framwwork 环境配置 简单举例说明 Django中使用 rest framework 1.1 安装 Django rest framework 建立新的环境 virtualenv env source env/bin/activate 安装 djangorestframework 模块 pip install django pip install djangorestframework pip insta

Django——REST framework

1. 什么是REST REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为"表征状态转移" REST从资源的角度类审视整个网络,它将分布在网络中某个节点的资源通过URL进行标识,客户端应用通过URL来获取资源的表征,获得这些表征致使这些应用转变状态 REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为"表征状态