前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >day94-认证组件&权限组件&访问评率限制

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

原创
作者头像
少年包青菜
修改2020-11-03 17:58:23
4450
修改2020-11-03 17:58:23
举报
文章被收录于专栏:Python 学习Python 学习

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
复制
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
复制
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
复制
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
复制
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
复制
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
复制
REST_FRAMEWORK = {
    "DEFAULT_AUTHENTICATION_CLASSES": [],
    # 添加如下,代表同一个 ip 一分钟可以访问 3 次
    "DEFAULT_THROTTLE_RATES": {"MM": "3/m", }
}

3.3关于访问频率如何定义

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

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

代码语言:javascript
复制
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
复制
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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.认证组件
    • 1.1定义认证,新建一个 auth.py 的文件
      • 1.2视图中使用认证组件
      • 2.权限组件
        • 2.1定义权限,新建一个 permissions.py 的文件
          • 2.2在视图中使用权限组件
          • 3.访问频率限制组件
            • 3.1定义访问频率类,新建一个 throttle.py 的文件
              • 3.2在 settings 里面的配置
                • 3.3关于访问频率如何定义
                  • 3.4在视图中使用频率限制组件
                    • 3.5参考实例代码:限制频率逻辑
                    领券
                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档