drf – Django Rest Framework Permissions权限验证详解

官方解释:

权限检查总是在视图的最开始运行,然后才允许其他代码继续。权限检查通常使用请求中的身份验证信息。用户和请求。验证属性,以确定传入请求是否应被允许。 权
限用于授予或拒绝不同类型的用户对API不同部分的访问。
最简单的权限样式是允许访问任何经过身份验证的用户,拒绝访问任何未经身份验证的用户。这对应于REST框架中的IsAuthenticated类。

其实意思很简单就是你把权限验证加上,如果写单个的接口(直接def或者继承单一的generics类)这样就可以验证所有用户访问,如果用户没有权限,那就会401

如果是直接继承ModelViewSet 生成标准的restful接口时,你只想让普通用户使用get接口,其他类型接口也可以对对应的权限验证 🐂🐂🐂

  • AllowAny:允许不受限制的访问,不管请求是否经过了身份验证。
  • IsAuthenticated:拒绝任何未经身份验证的用户的权限,而允许其他用户的权限。如果您希望您的API仅对注册用户可访问,则此权限是合适的。
  • IsAdminUser:拒绝任何用户的权限,除非use.is_staff为True,在这种情况下允许访问。
  • IsAuthenticatedOrReadOnly:允许经过身份验证的用户执行任何请求。对于未获授权用户的请求,会被允许GET、HEAD或OPTIONS。
class UserSigninAPIView(GenericAPIView):
    permission_classes = [IsAdminUser]
    ...

    ...

drf提供了permission_classes装饰器来方便你的使用

@permission_classes([IsAdminUser])
def user_signin(request):
    pass

因为使用drf默认的验证类时,在Postman等类似平台进行接口测试容易引发CSRF认证错误❌,所以自定义验证类。

自定义验证类需要继承自permissions.BasePermission,并且重写has_permission方法来定义您自己的验证类

has_permission方法return True或者False

class IsMyUser(permissions.BasePermission):
"""
    仅允许Token验证成功的用户访问
"""

    default_error_messages = {
        'invalid__token': 'token无效'
    }

    def has_permission(self, request, view):
        token = request.META.get("HTTP_TOKEN")
        user_token = Token.objects.filter(key=token).first()
        if not user_token:
            raise ParamsException(self.default_error_messages['invalid__token'], 401)
        if timezone.now() > (user_token.created + timedelta(days=TOKEN_LIFETIME)):
            raise ParamsException(self.default_error_messages['invalid__token'], 401)
        return True

如果你在一个接口类中定义了多个接口,但是你想让不同的用户访问到不同类型的接口,您就需要重写接口类中的get_permissions方法

以下面接口为例

ModelViewSet中会有list、retrieve、create…等方法,你可以在get_permissions通过self.action来获得他们并指定这些接口可访问的用户

class VideoModelViewSet(ModelViewSet):
    serializer_class = VideoSerializer
    queryset = Video.objects.all()

    def get_permissions(self):
        if self.action == "retrieve":
            return [IsExeUser()]
        return [IsAdmin()]
    ...

    ...

来我的GitHub来看更多关于DRF的资料吧

https://github.com/Tengxu666/DRF_Professional

Original: https://blog.csdn.net/weixin_51098806/article/details/123706679
Author: Clyde_刘
Title: drf – Django Rest Framework Permissions权限验证详解



相关阅读

Title: YOLOv5中的CSP结构

深度学习入门小菜鸟,希望像做笔记记录自己学的东西,也希望能帮助到同样入门的人,更希望大佬们帮忙纠错啦~侵权立删。

目录

一、背景知识 — CSPNet

二、CSP结构分析

1、总括

2、CSP1_X结构(BottleneckCSP和C3均有分析)

3、CSP2_X结构(BottleneckCSP和C3均有分析)

三、源码分析(内含注释分析)

1、BottleneckCSP部分

2、C3部分

一、背景知识 — CSPNet

有关CSPNet的介绍分析可以康康博主之前的博客

深度学习之CSPNet分析_tt丫的博客-CSDN博客

二、CSP结构分析

1、总括

YOLOv5s的CSP结构是将原输入分成两个分支,分别进行卷积操作使得通道数减半,然后一个分支进行Bottleneck * N操作,然后concat两个分支,使得BottlenneckCSP的输入与输出是一样的大小,这样是为了让模型学习到更多的特征。

YOLOv5中的CSP有两种设计,分别为CSP1_X结构和CSP2_X结构。

2、CSP1_X结构(BottleneckCSP和C3均有分析)

🌳BottleneckCSP的网络结构图如下图所示:

【(1)其中CBS为Conv+BN+SiLu,代码解析等详见往期博客YOLOv5中的Focus层详解_tt丫的博客-CSDN博客中的代码分析部分。

(2)其中Resunit是x个残差组件,相关介绍详见往期博客详解YOLOv5中的Bottleneck_tt丫的博客-CSDN博客

(后面的图都是CBL(conv+BN+Leaky relu)改成CBS(conv+BN+SiLU)哈,之前没注意它的名称变化。)

drf - Django Rest Framework Permissions权限验证详解

将输入分为两个分支,一个分支先通过CBS,再经过多个残差结构(Bottleneck * N),再进行一次卷积;另一个分支直接进行卷积;然后两个分支进行concat,再经过BN(正态分布),再来一次激活(之前的版本是Leaky,后期是SiLU),最后进行一个CBS。

🌳C3的网络结构图如下图所示:

drf - Django Rest Framework Permissions权限验证详解

CSP1_X应用于backbone主干网络部分(backbone具体介绍以后再说哒),backbone是较深的网络,增加残差结构可以增加层与层之间反向传播的梯度值,避免因为加深而带来的梯度消失,从而可以提取到更细粒度的特征并且不用担心网络退化。

3、CSP2_X结构(BottleneckCSP和C3均有分析)

🌳BottleneckCSP的网络结构图如图所示

drf - Django Rest Framework Permissions权限验证详解

🌳C3的网络结构图如图所示

drf - Django Rest Framework Permissions权限验证详解

CSP2_X相对于CSP1_X来说,不一样的地方只有CSP2_X将Resunit换成了2 * X个CBS,主要应用在Neck网络 (网络没那么深)。

(同样的,之前的版本是Leaky,后期是SiLU)

三、源码分析(内含注释分析)

每一部分对应网络结构中的哪一部分都有标注如下

(其中Bottleneck类的分析见博客详解YOLOv5中的Bottleneck_tt丫的博客-CSDN博客

1、BottleneckCSP部分

;

class BottleneckCSP(nn.Module):
    #CSP结构
    def __init__(self, c1, c2, n=1, shortcut=True, g=1, e=0.5):  # ch_in, ch_out, number, shortcut, groups, expansion
        super().__init__()
        c_ = int(c2 * e)  # hidden channels
        self.cv1 = Conv(c1, c_, 1, 1)#对应上面网络结构图的上面的分支的第一个CBL
        self.cv2 = nn.Conv2d(c1, c_, 1, 1, bias=False)#对应上面网络结构图的下面的分支的conv
        self.cv3 = nn.Conv2d(c_, c_, 1, 1, bias=False)#对应上面网络结构图的上面的分支的conv
        self.cv4 = Conv(2 * c_, c2, 1, 1)#对应最后的CBL
        self.bn = nn.BatchNorm2d(2 * c_)  # applied to cat(cv2, cv3)
        self.act = nn.SiLU()#对应Concat后的Leaky ReLU,这里看到后期的版本是改成了SiLU
        self.m = nn.Sequential(*(Bottleneck(c_, c_, shortcut, g, e=1.0) for _ in range(n)))
        #nn.Sequential--序贯模型是函数式模型的简略版,为最简单的线性、从头到尾的结构顺序,不分叉,是多个网络层的线性堆叠。
        #self.m对应X个Resunit or 2 * X个CBL(对应的切换是通过Bottleneck类中的True 或 False决定,True为X个Resunit,False为2 * X个CBL)
    def forward(self, x):
        y1 = self.cv3(self.m(self.cv1(x)))#对应上面网络结构图的上面的分支
        y2 = self.cv2(x)#对应上面网络结构图的下面的分支
        return self.cv4(self.act(self.bn(torch.cat((y1, y2), dim=1))))
        #torch.cat对应Concat
        #self.bn对应Concat后的BN

2、C3部分

class C3(nn.Module):
    # CSP Bottleneck with 3 convolutions
    def __init__(self, c1, c2, n=1, shortcut=True, g=1, e=0.5):  # ch_in, ch_out, number, shortcut, groups, expansion
        super().__init__()
        c_ = int(c2 * e)  # hidden channels
        self.cv1 = Conv(c1, c_, 1, 1)#对应上面网络结构图的上面的分支的第一个CBL
        self.cv2 = Conv(c1, c_, 1, 1)#对应上面网络结构图的下面的分支的CBL
        self.cv3 = Conv(2 * c_, c2, 1)#对应最后的CBL
        self.m = nn.Sequential(*(Bottleneck(c_, c_, shortcut, g, e=1.0) for _ in range(n)))
        # self.m = nn.Sequential(*[CrossConv(c_, c_, 3, 1, g, 1.0, shortcut) for _ in range(n)])
        #self.m对应X个Resunit or 2 * X个CBL(对应的切换是通过Bottleneck类中的True 或 False决定,True为X个Resunit,False为2 * X个CBL)
    def forward(self, x):
        return self.cv3(torch.cat((self.m(self.cv1(x)), self.cv2(x)), dim=1))
        #torch.cat对应Concat

欢迎大家在评论区批评指正,谢谢大家~

Original: https://blog.csdn.net/weixin_55073640/article/details/122614176
Author: tt丫
Title: YOLOv5中的CSP结构

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/288723/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

最近整理资源【免费获取】:   👉 程序员最新必读书单  | 👏 互联网各方向面试题下载 | ✌️计算机核心资源汇总