博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
rest framework 认证 权限 频率
阅读量:6484 次
发布时间:2019-06-23

本文共 4740 字,大约阅读时间需要 15 分钟。

 认证组件

发生位置

APIview 类种的 dispatch 方法执行到 initial 方法 进行 认证组件认证

源码位置

rest_framework.authentication

 源码内部需要了解的

# 用户用户自定义的重写继承类class BaseAuthentication(object):       ...    # 自定义重写的认证方法    def authenticate(self, request):...# 以下4种为自带 认证# 基于用户名和密码的认证class BasicAuthentication(BaseAuthentication):...# 基于 session 的认证class SessionAuthentication(BaseAuthentication):... # 基于 token 的认证class TokenAuthentication(BaseAuthentication):...   # 基于远端服务的认证 class RemoteUserAuthentication(BaseAuthentication):...

 

自定义认证函数

from rest_framework.authentication import BaseAuthenticationfrom rest_framework.exceptions import AuthenticationFailedfrom api.models import *class YTAuth(BaseAuthentication):    def authenticate(self, request):        token = request.query_params.get('token')        obj = UserAuthToken.objects.filter(token=token).first()        if not obj:            return AuthenticationFailed({
'code': 1001, 'erroe': '认证失败'}) return (obj.user.username, obj)  # 返回的必须是元组 然后元组的里面含有两个值 并且对应的取值是rquest.user(user对象),和reques.auth(token对象)

 

 视图级别认证

class CommentViewSet(ModelViewSet):    queryset = models.Comment.objects.all()    serializer_class = app01_serializers.CommentSerializer    authentication_classes = [YTAuth, ]

 

 全局认证

# 在settings.py中配置REST_FRAMEWORK = {    "DEFAULT_AUTHENTICATION_CLASSES": ["app01.utils.YTAuth", ]}

 

权限组件

发生位置

APIview 类种的 dispatch 方法执行到 initial 方法 进行 认证组件执行后,进行权限组件认证

源码位置

rest_framework.permissions

权限组件内部需要了解的

# 自定义重写的类class BasePermission(object):    ...    # 自定义重写的方法     def has_permission(self, request, view): ...# AllowAny 允许所有用户class AllowAny(BasePermission):...# IsAuthenticated 仅通过认证的用户class IsAuthenticated(BasePermission):...# IsAdminUser 仅管理员用户class IsAdminUser(BasePermission):...# IsAuthenticatedOrReadOnly 认证的用户可以完全操作,否则只能get读取class IsAuthenticatedOrReadOnly(BasePermission):...

 

 自定义权限组件

from rest_framework.permissions import BasePermissionclass MyPermission(BasePermission):    message = 'VIP用户才能访问'    def has_permission(self, request, view):        # 认证判断已经提供了request.user        if request.user and request.user.type == 2:              return True        else:            return False

 

 视图级别使用自定义权限组件

class CommentViewSet(ModelViewSet):     queryset = models.Comment.objects.all()    serializer_class = app01_serializers.CommentSerializer    authentication_classes = [YTAuth, ]    permission_classes = [YTPermission, ]

 

 全局级别使用自定义权限组件

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

频率限制

发生位置

APIview 类种的 dispatch 方法执行到 initial 方法 进行 认证组件执行,权限组件认证后 ,进行频率组件的认证

源码位置

rest_framework.throttling

权限组件内部需要了解的

# 需要自定义重写的类 class BaseThrottle(object):...    # 自定义频率的逻辑实现方法    def allow_request(self, request, view):    ...    # 自定义 限制后逻辑实现方法    def wait(self):    ...# 内置的频率控制组件 常用的是这个class SimpleRateThrottle(BaseThrottle): ...# 其他都不怎么用class AnonRateThrottle(SimpleRateThrottle): ...# 其他都不怎么用class UserRateThrottle(SimpleRateThrottle):# 其他都不怎么用class ScopedRateThrottle(SimpleRateThrottle):

 

自定义频率组件

import timeVISIT_RECORD = {} class YTThrottle(object): # 直接继承 object 就可以了    def __init__(self):        self.history = None    def allow_request(self, request, view):        """        自定义频率限制60秒内只能访问三次        """        # 获取用户IP        ip = request.META.get("REMOTE_ADDR")        timestamp = time.time()        if ip not in VISIT_RECORD:            VISIT_RECORD[ip] = [timestamp, ]            return True        history = VISIT_RECORD[ip]        self.history = history        history.insert(0, timestamp)        while history and history[-1] < timestamp - 60:            history.pop()        if len(history) > 3:            return False        else:            return True    def wait(self):        """        限制时间还剩多少        """        timestamp = time.time()        return 60 - (timestamp - self.history[-1])

 

 视图级别使用自定义频率组件

class CommentViewSet(ModelViewSet):    queryset = models.Comment.objects.all()    serializer_class = app01_serializers.CommentSerializer    throttle_classes = [YTThrottle, ]

 

 全局级别使用自定义频率组件

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

 

ps:

  使用内置 SimpleRateThrottle 频率控制组件

from rest_framework.throttling import SimpleRateThrottleclass VisitThrottle(SimpleRateThrottle):    scope = "xxx"    def get_cache_key(self, request, view):        return self.get_ident(request)

 

全局使用 

# 在settings.py中设置rest framework相关配置项REST_FRAMEWORK = {     ...   "DEFAULT_THROTTLE_RATES": {        "xxx": "5/m",  # 每分钟5次最多    }}

 

转载于:https://www.cnblogs.com/shijieli/p/10273651.html

你可能感兴趣的文章
安卓Glide(4.7.1)使用笔记 01 - 引入项目
查看>>
中金易云:为出版社找到下一本《解忧杂货店》
查看>>
Flex布局
查看>>
Material Design之 AppbarLayout 开发实践总结
查看>>
Flutter之MaterialApp使用详解
查看>>
DataBinding最全使用说明
查看>>
原生Js交互之DSBridge
查看>>
Matlab编程之——卷积神经网络CNN代码解析
查看>>
三篇文章了解 TiDB 技术内幕 —— 说计算
查看>>
copy strong weak assign的区别
查看>>
OpenCV 入门
查看>>
css 3D transform变换
查看>>
ele表格合并行之后的selection选中
查看>>
正则表达式分解剖析(一文悟透正则表达式)
查看>>
解决UILable标点符号居中的问题
查看>>
HTML5新特性教程
查看>>
ImageOptim-无损图片压缩Mac版
查看>>
传统运维团队转型应该注意哪些问题?
查看>>
JavaScript函数(二)
查看>>
Airbnb改进部署管道安全性,规范部署顺序
查看>>