Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >day94-认证组件&权限组件&访问评率限制

day94-认证组件&权限组件&访问评率限制

原创
作者头像
少年包青菜
修改于 2020-11-03 09:58:23
修改于 2020-11-03 09:58:23
49400
代码可运行
举报
文章被收录于专栏:Python 学习Python 学习
运行总次数:0
代码可运行

1.认证组件

1.1定义认证,新建一个 auth.py 的文件

1.1.1 继承BaseAuthentication

1.1.2 钩子函数名是确定的

1.1.3 返回值返回两个参数,request.user 和 request.auth,即 user_obj 和 token

1.1.4 获取 token 的方式有多种,见贴图

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from rest_framework import authentication
from django.core.cache import cache
from rest_framework.request import Request
from rest_framework.exceptions import AuthenticationFailed
from app_auth import models

class Authentication(authentication.BaseAuthentication):
    def authenticate(self, request: Request):
        token = request.META.get('HTTP_AUTHORIZATION')  # redis获得 token
        user_pk = cache.get(token)  # 有 token 获得 user_id
        if user_pk:
            user_obj = models.User.objects.filter(pk=user_pk).first()
            cache.set(token, user_pk, 60 * 20)  # redis重新设置最大过期时间
            return user_obj, token
        raise AuthenticationFailed('非法操作')  # 没有 tok

1.2视图中使用认证组件

1.2.1 导入自己写的认证类,使用方法如下,可以接收多个

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class TestView(APIView):
    # 认证组件直接使用
    authentication_classes = [auth.Authentication, ]

    def get(self, request):
        return Response('测试认证组件')

2.权限组件

2.1定义权限,新建一个 permissions.py 的文件

2.1.1 继承BasePermission

2.1.2 定义 message ,定义内容为 错误信息

2.1.3 权限的定义类有多中,见贴图

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from rest_framework import permissions
from rest_framework.request import Request


class UserPermission(permissions.BasePermission):
    message = '权限不足'

    def has_permission(self, request: Request, view):
        # request.user.has_perm()
        # 超管全是 True
        if 'app01.view_book' in [item for item in request.user.get_all_permissions()]:
            return True
        return False

2.2在视图中使用权限组件

2.2.1 导入自己写的权限类,使用方法如下,可以接收多个

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class TestPermission(APIView):
    # 认证
    authentication_classes = [auth.Authentication, ]
    # 权限
    permission_classes = [permissions.UserPermission, ]

    def get(self, request):
        return Response('可以观看 vip 电影')

3.访问频率限制组件

3.1定义访问频率类,新建一个 throttle.py 的文件

3.1.1 继承SimpleRateThrottle

3.1.2 scope 的内容在 settings 里面定义

3.1.3 其余内容不变

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from rest_framework.throttling import SimpleRateThrottle


class MyThrottle(SimpleRateThrottle):
    scope = 'MM'

    def get_cache_key(self, request, view):
        # 拿到ip地址
        return self.get_ident(request)

3.2在 settings 里面的配置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
REST_FRAMEWORK = {
    "DEFAULT_AUTHENTICATION_CLASSES": [],
    # 添加如下,代表同一个 ip 一分钟可以访问 3"DEFAULT_THROTTLE_RATES": {"MM": "3/m", }
}

3.3关于访问频率如何定义

3.4在视图中使用频率限制组件

3.4.1 导入自己写的频率限制类,使用方法如下,可以接收多个

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class TestPermission(APIView):
    # 认证
    authentication_classes = [auth.MyAuth, ]
    # 权限
    permission_classes = [permissions.MyPermission, ]
    # 限制访问
    throttle_classes = [throttle.MyThrottle]

    def get(self, request):
        return Response('可以观看 vip 电影')

3.5参考实例代码:限制频率逻辑

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import time

VISIT_RECORD = {}


class MyThrottle(object):
    """
    一分钟允许访问5"""

    def __init__(self):
        self.history = []

    def allow_request(self, request, view):
        # 获取用户的IP地址
        ip = request.META.get("REMOTE_ADDR", "")
        if ip not in VISIT_RECORD:
            VISIT_RECORD[ip] = [time.time(), ]
        else:
            history = VISIT_RECORD[ip]
            self.history = history
            history.insert(0, time.time())
            # 确保列表时间是允许范围之内
            while self.history[0] - self.history[-1] > 60:
                self.history.pop()
            # 判断列表长度
            if not len(self.history) <= 5:
                return False
        return True

    # 等待时间
    # [最近时间,      最老时间]
    def wait(self):
        return 60 - (self.history[0] - self.history[-1])

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Django Rest Framework(认证、权限、限制访问频率)
上述操作中均是对单独视图进行特殊配置,如果想要对全局进行配置,则需要再配置文件中写入即可。
用户1214487
2022/03/26
3K0
Django Rest Framework(认证、权限、限制访问频率)
DjangoRestFramework,认证组件、权限组件、频率组件、url注册器、响应器、分页组件
    我们知道,我们不管路由怎么写的,对应的视图类怎么写的,都会走到dispatch方法,进行分发,
changxin7
2019/12/20
6630
DjangoRestFramework,认证组件、权限组件、频率组件、url注册器、响应器、分页组件
rest_framework框架的基本组件
快速实例 Quickstart 序列化 创建一个序列化类 简单使用 开发我们的Web API的第一件事是为我们的Web API提供一种将代码片段实例序列化和反序列化为诸如json之类的表示形式的方式。我们可以通过声明与Django forms非常相似的序列化器(serializers)来实现。 models部分: from django.db import models # Create your models here. class Book(models.Model): title=mod
阿强Wwlt
2018/07/09
9250
Django rest framework源码分析(3)----节流
添加节流 自定义节流的方法  限制60s内只能访问3次 (1)API文件夹下面新建throttle.py,代码如下: # utils/throttle.py from rest_framework.throttling import BaseThrottle import time VISIT_RECORD = {} #保存访问记录 class VisitThrottle(BaseThrottle): '''60s内只能访问3次''' def __init__(self):
zhang_derek
2018/04/11
1.1K0
Django rest framework源码分析(3)----节流
drf之认证、权限、频率
新建一个自定义类,该类继承rest_framework.authentication中的BaseAuthentication 类,重写其中的authenticate 方法。将需要的认证逻辑写在里面。当认证通过是需要返回两个值,其中一个值最终给了Request 的user 。认证失败时,抛出异常:APIException或者AuthenticationFailed 。其中该方法必须重写,如不重写其中没有认证逻辑,则直接抛出异常。
仙人技术
2020/07/28
1K0
DRF-认证权限频率
我们知道在APIView执行的过程中,在dispatch方法中走了三大认证self.initial(request, *args, **kwargs)
HammerZe
2022/05/09
6760
DRF-认证权限频率
drf-jwt认证组件、权限组件、频率组件的使用
在restframework中自带认证组件,而其自带的认证组件是如何认证校验的呢:
GH
2020/02/11
2.4K0
jwt认证生成后的token后端解析
{'authorization':token的值',Content-Type':application/json}
小小咸鱼YwY
2020/06/19
3.6K0
Django REST 框架详解 10 | 频率认证组件
APIView 的 dispatch 中使用 initial 方法实现初始化并进行三大认证,第三步进行权限组件调用
白墨石
2021/01/12
1K0
Python进阶42-drf框架(四)
-多年互联网运维工作经验,曾负责过大规模集群架构自动化运维管理工作。 -擅长Web集群架构与自动化运维,曾负责国内某大型金融公司运维工作。 -devops项目经理兼DBA。 -开发过一套自动化运维平台(功能如下): 1)整合了各个公有云API,自主创建云主机。 2)ELK自动化收集日志功能。 3)Saltstack自动化运维统一配置管理工具。 4)Git、Jenkins自动化代码上线及自动化测试平台。 5)堡垒机,连接Linux、Windows平台及日志审计。 6)SQL执行及审批流程。 7)慢查询日志分析web界面。
DriverZeng
2022/09/26
1.8K0
Python进阶42-drf框架(四)
drf框架中jwt认证,以及自定义jwt认证
官方:http://getblimp.github.io/django-rest-framework-jwt/
小小咸鱼YwY
2019/09/12
2.7K0
实战-DRF快速写接口(认证权限频率)
实战-DRF快速写接口 开发环境 Python3.6 Pycharm专业版2021.2.3 Sqlite3 Django 2.2 djangorestframework3.13 测试工具 Postman 需求 注册接口,包含字段用户名,密码,确认密码,用户类型 登陆接口,校验用户名,密码,生成随机字符串 认证功能,除了注册登陆接口外,所有接口都要登陆后访问 频率限制功能,每分钟访问5次,book的所有接口,使用这个频率类 权限限制功能,publish的所有操作需要超级用户能访问,其他的普通登陆用户就
HammerZe
2022/05/09
5510
实战-DRF快速写接口(认证权限频率)
python测试开发django-61.权限认证(permission)
用户登录后,才有操作当前用户的权限,不能操作其它人的用户,这就是需要用到权限认证,要不然你登录自己的用户,去操作别人用户的相关数据,就很危险了。
上海-悠悠
2019/09/17
2.2K0
python测试开发django-61.权限认证(permission)
从入门到"精通"Django REST Framework-(四)
APIView 是 Django REST Framework (DRF) 中提供的基础视图类,继承自 Django 的 View 类,但针对 RESTful API 进行了扩展。它支持以下功能:
rxg456
2025/02/27
2140
从入门到"精通"Django REST Framework-(四)
认证组件
 只有认证通过的用户才能访问指定的url地址,比如:查询课程信息,需要登录之后才能查询,没有登录就不能查看 ,这时候就要用到认证组件
py3study
2020/01/20
7080
3. DRF进阶之DRF视图和常用功能
APIView:DRF提供的所有视图的基类,继承View并扩展,具备了身份认证、权限检查、流量控制等功能
alexhuiwang
2023/01/16
5.3K0
rest_framework组件
认证组件 局部认证 在需要认证的视图类里加上authentication_classes = [认证组件1类名,认证组件2类名....] 示例如下: seralizers.py from rest_framework import serializers from app01 import models class PublishSerializers(serializers.ModelSerializer): class Meta: model = models.Publish
人生不如戏
2018/05/30
3510
drf框架中认证与权限工作原理及设置
2)如果前台携带了认证信息并认证通过,定位为登录用户,将登录的用户user对象保存在 requset.user 中
小小咸鱼YwY
2019/09/12
1.4K0
Django之频率组件
写一个类,继承自SimpleRateThrottle,(根据ip限制)问:要根据用户现在怎么写:
py3study
2020/01/20
6440
rest_framework -- 认证
#####认证组件##### 一、认证是什么就不说了,某些网页必须是用户登陆之后,才能访问的,所以这时候就需要用上认证组件。 你不用rest_framework的认证组件也行,这种认证的话,完全可以自己写出来。 二、之前再写APIView的时候,那里提到过。 不记得在哪里的话,先找dispatch方法(APIView的记得),然后是self.initial(request, *args, **kwargs), 最后找到self.perform_authentication(re
py3study
2020/02/10
4700
相关推荐
Django Rest Framework(认证、权限、限制访问频率)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验