首页 > 其他分享 >DRF路由、认证、权限、频率

DRF路由、认证、权限、频率

时间:2022-11-27 21:47:53浏览次数:47  
标签:get self request 认证 频率 权限 class 路由 DRF

DRF路由、认证、权限、频率

目录

路由

原来直接在urls.py中直接.as_view()即可

现在

# 一旦视图类继承了ViewSetMixin,则要在路由中配置actions函数

继承了ModelViewSet的视图类

# 自动配置路由
from rest_framework import routers
router = routers.SimpleRouter() # SimpleRouter只会生成两条url
router.register('books','views.BookViewSet') # router.register('前缀','继承自ModelViewSet的视图类','别名')

urlpatterns += router.urls

# 另有
router = routers.DefaultRouter() # DefaultRouter会生成六条url

action的使用

from rest_framework.decorators import action
class BookModelViewSet(ModelViewSet):
    queryset = Book.objects.all()
    serializer_class = BookSerializer
    @action(methods=['get',],detail=False) # 向'/get_2/'后缀发送列表中注册的请求时会执行下面函数
    def get_2(self,request):
        book = self.get_queryset()[:2]
        ser = self.get_serializer(book,many=True)
# 如果detail=True,则生成的路由中配置了有名分组pk,需要'/1/get_2'类似的请求,且函数应添加形参pk

认证

# 认证的实现
'''
1.写一个类,继承BaseAuthentication类
from rest_framework.authentication import BaseAuthentication
2.重写authenticate方法,内有认证逻辑,认证通过返回两个值一个值给request.user,另一个值给request.auth,认证失败,抛出AuthenticationFailed异常
3.
'''

源码

# APIView>dispatch>self.initial
self.perform_authentication(request) # >return request.user
class Request # 
    @property
    def user(self):
        self._authenticate()
_authenticate():
    for authenticator in self.authenticators: # 循环自定义配置的认证类(列表)的认证对象列表
        user_auth_tuple = authenticator.authenticate(self) # 这里就用了自己重写的authenticate方法

写认证类

# 应用内新建python文件
from rest_framework.authentication import BaseAuthentication


class MyAuthentication(BaseAuthentication):
    def authenticate(self, request):

认证类的使用

# 全局使用
from app01.Myauth import MyAuthentication
REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'MyAuthentication',

    ],
}
# 在具体视图类中定义authentica_classes为空列表可以局部禁用

# 局部使用
# 在视图类中定义authentication_classes=[]

权限

源码

# APIView>dispatch>self.initial>self.check_permissions(request)

权限的使用

# 定义权限类
from rest_framework.permissions import BasePermission
class UserAdminPermission(BasePermission):
    def has_permission(self, request, view):
        user = request.user
        # print(user.get_permissions_display())
        if user.permissions == 1:
            return True
        else:
            return False

# 局部使用
class NewBooksView(ListAPIView, CreateAPIView):
    permission_classes = [UserAdminPermission]
    queryset = Book.objects.all()
    serializer_class = NewBookModelSerializer

# 全局使用
REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': [
        'app01.123.UserAdminPermission',

    ],
}

# 局部禁用
permission_classes = []

内置权限

from rest_framework.authentication import SessionAuthentication
from rest_framework.permissions import IsAdminUser

class NewBooksView(ListAPIView, CreateAPIView):
    authentication_classes = [SessionAuthentication]
    permission_classes = [IsAdminUser]
    queryset = Book.objects.all()
    serializer_class = NewBookModelSerializer

频率

内置频率

# 全局使用
REST_FRAMEWORK = {
    'DEFAULT_THROTTLE_CLASSES': ['rest_framework.throttling.AnonRateThrottle'],
    'DEFAULT_THROTTLE_RATES': {
        'anon':'3/m', # 限制匿名用户每分钟3次访问
    }
}
# 局部使用
REST_FRAMEWORK = {
    'DEFAULT_THROTTLE_RATES': {
        'anon':'3/m', # 限制匿名用户每分钟3次访问
    }
}
class NewNewBooksView(ListAPIView, CreateAPIView):
    authentication_classes = [AnonRateThrottle]

    queryset = Book.objects.all()
    serializer_class = NewBookModelSerializer

# 局部禁用
class NewNewBooksView(ListAPIView, CreateAPIView):
    authentication_classes = []

# 如果要使用内置登录用户频率限制,则作用的也只是auth_user

频率限制

# 新建频率类继承SimpleRateThrottle以重写其内部的get_cache_key方法,并标明配置名称
from rest_framework.throttling import SimpleRateThrottle

class MyThrottle(SimpleRateThrottle):
    scope = 'xxx'
    def get_cache_key(self, request, view):# return结果是频率限制的key
        return request.META.get('REMOTE_ADDR')

# 局部配置或者全局配置频率类
class BookView(ListAPIView):
    throttle_classes = [MyThrottle]
    queryset = models.Book.objects.all()
    serializer_class = BookModelSerializer
    pagination_class = MYLimitOffsetPagination
# 全局配置对应名称的频率值限制
REST_FRAMEWORK = {
    'DEFAULT_THROTTLE_RATES': {
        'xxx': '3/m',
    },
}

自定义频率

from rest_framework.throttling import BaseThrottle
# 自定义频率类,需要重写两个方法,即allow_request、wait
class IPThrottle(BaseThrottle):
    visit_dict = {}
    def __init__(self):
        self.history_list = []
    def allow_request(self, request, view):
        ip = request.META.get('REMOTE_ADDR')
        ctime = time.time()
        if ip not in self.visit_dict:
            self.visit_dict[ip] = [ctime,]
            return True
        self.history_list = self.visit_dict[ip]
        while True:
            if ctime-self.history_list[-1]>60:
                self.history_list.pop()
            else:
                break
        if len(self.history_list)<2: # 配置一个周期内的频次限制
            self.history_list.insert(0,ctime)
            return True
        else:
            return False
    def wait(self):
        ctime = time.time()
        return 60 - (ctime-self.history_list[-1])

from utils.throttle1 import IPThrottle
class BookView(ListAPIView):
    throttle_classes = [IPThrottle]
    queryset = models.Book.objects.all()
    serializer_class = BookModelSerializer
    pagination_class = MYLimitOffsetPagination

标签:get,self,request,认证,频率,权限,class,路由,DRF
From: https://www.cnblogs.com/missfxy/p/16930677.html

相关文章

  • DRF过滤、排序、异常处理、自定义Response、分页
    DRF过滤、排序、异常处理、自定义Response、分页目录DRF过滤、排序、异常处理、自定义Response、分页过滤局部过滤排序异常处理封装Response对象分页三种分页方式PageNumb......
  • Django路由层
    Django路由层目录Django路由层路由匹配无名分组有名分组反向解析无名分组反向解析有名分组反向解析路由分发名称空间伪静态虚拟环境null路由匹配#url方法第一个参数是......
  • spring gateway路由出现503、404错误解决方法
    查资料发现在网关出现503错误是因为全局过滤器没有加载(ReactiveLoadBalancerClientFilter),只需要将含有这个过滤器的依赖进行导入就行了<dependency><groupId>org.......
  • 【面试题】 面试官为啥总是喜欢问前端路由实现方式?
    背景从事前端开发的同学,在实际工作中,一定会接触过路由这个概念,同时在面试的过程中,经常会被问及关于前端路由的实现方式,面试官到底想考察什么?在现在SPA单页面模式盛行,前后端......
  • 动态路由---OSPF数据包和状态
    1.RouterID先看回环口,再看物理接口手动配置<Huawei>sys[Huawei]ospf1router-id1.1.1.1说明: 这个ID看起来像一个IP地址,但是跟设备的接口地址是没有关系的,可以......
  • 动态路由---OSPF基础概念
    1.OSPF概述OpenShortestPathFirst,开放最短路径优先大中型网络上使用最为广泛的IGP协议链路状态路由协议无类使用组播(224.0.0.5和224.0.0.6)收敛较快以开销(Cost)作......
  • kali linux添加普通用户和权限分配
    kali下添加用户和权限分配添加用户#useradd-mpte#-m的意思是创建用户的主目录为用户pte设置密码。#passwdpte为添加的用户赋予权限(-a添加;-G群组)如......
  • 中小型企业华为路由器+防火墙+核心交换机网络部署
    网络组网图:  网络规划:办公网VLAN:10,IP地址段:192.168.10.0/24,网关192.168.10.254生产网络VLAN:20,IP地址段:192.168.20.0/24,网关192.168.20.254生产服务器地址段:172.16......
  • 文件权限的理解
    shell命令以及运行原理和Linux权限详解入门小站 入门小站 2022-11-1521:50 发表于湖北收录于合集#Linux632个入门小站分享运维技巧及10k+Stars的开源......
  • 静态路由
    1.技术背景如果只有直连路由,那么就只能到达直连的网络而无法到达远程网络解决办法:手动添加路由......