DRF的认证、权限、限流、序列化、反序列化

DRF的认证、权限、限流、序列化、反序列化

一、认证

1、直接用,用户授权

  • 实现方法

    • 编写 ->认证组件

    • 应用组件

  • 编写 ->认证组件

from rest_framework.authentication import BaseAuthentication
from rest_framework.exceptions import AuthenticationFailed
class 认证类(BaseAuthentication):def authenticate(self,request):1、 获取用户信息1.1 可以从URL中获取,xx/xx/xx/?token=....request.query_params(token) 来获取token值1.2 可以从请求头中获取request.META.get("HTTP_AUTHORIZATION")# AUTHORIZATION传递过来的key1.3 可以从请求体中获取request.data.get(token)2、校验用户信息的合法性3、返回结果- 3.1 正确,返回元组(用户信息,认证信息如token)- 3.2 错误,raise抛出错误信息raise AuthenticationFailed({key:vaule})#注:可以用字典提示错误- 3.3 错误返回None->多个认证类 [1,类2....]return user,authdef authenticate_header(self,request):return "token"#认证失败状态应该是401,如果authenticate_header不返回值,就是403

​ BaseAuthentication源码是:

class BaseAuthentication:#注:只要在django中出现raise NotImplementedError(),就必须使用该方法,不然会出错!(重定义方法)。子类约束。def authenticate(self,request):raise NotImplementedError("必顺要写的函数。")def authenticate_header(self,request):pass
  • 应用组件
    • 局部
from rest_framework.views import APIView
from rest_framework.response import Response
#在视图类中添加
class 视图类名(APIView):authentication_classes = [认证类1,认证类2,认证类3.....]
  • 全局(在setting中设置)

    REST_FRAMEWORK = {"UNAUTHENTICATED_USER":None,#是让没有用户时为None,默认是AnyOne,"DEFAULT_AUTHENTICATION_CLASSES":["自定义认证类的位置"]
    }
    # 注:在配置全局时,不能写在视图类中。视图类还没有加载完。
    

    在全局配置时,如果要让某个视图不进行认证,就在视图类中把authentication_classes=[]

  • 注:

    • 多个认证类
      多个认证类是或的关系,但返回的值是None,前面的认证成功,后面的就不认证了。如果都不认证成功,一般最后一个为抛出异常类。
      抛出异常类

      class NoAuthentictions(BaseAuthentication):def authenticate(self,request):raise AuthenticationFailed({key:vaule})def authenticate_header(self,request):return 'Token'
      

回顾

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2、认证组件源码

二、权限

1. 直接使用,用户权限

  • 权限组件说明

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 权限组件编写
from rest_framework.permissions import BasePermissionclass 权限类名(BasePermission):messge={.....}#权限失败是返回的错误信息def has_permission(self,request,view):1. 获取请求中的数据2. 校验3. 返回值3.1 返回True 表示校验通过3.2 返回False 表示校验没通过return True | False
  • 权限组件的使用

    • 局部使用(在视图中添加)
    from rest_framework.views import APIViewclass 视图类名(APIView):permission_classes = [权限类名1,权限类名2,权限类名3....]#权限类名是一个且的关系,前面的是False后面的就不再执行了。
    
    • 全局(setting.py)中

    • REST_FRAMEWORK = {"UNAUTHENTICATED_USER":None,#是让没有用户时为None,默认是AnyOne,"DEFAULT_AUTHENTICATION_CLASSES":["自定义认证类的位置"],"DEFAULT_PERMISSION_CLASSES":["自己定义的权限类位置"]#可以是一个列表
      }
      # 注:在配置全局时,不能写在视图类中。视图类还没有加载完。
      
  • 权限或组件的编写

    系统默认的是且关系,而不是或的关系,以下是或的关第编写

#要在APIView中编写代码
from rest_framework.views import APIViewclass 自定义或权限关系类名(APIView):def check_permission(self,request):permission_objects = self.get_permissions()for permission in permission_objects:if permission.has_permission(request,self):returnelse:self.permission_denied(request,message=getattr(permission_objects[0],'message',None),code=getattr(permission_objects[0],'code',None))
for...in...:....
else:....
#当循环完后,有返回False时,才执行else

在视图类中,继承自定义或权限关系类名

2.权限组件源码

三、序列化

1. 序列化

序列化,从数据库获取Query_Set或数据对像 ->JSON

序列化的流程

路由->视图->去数据库获取对象或QuerySet -> 序列化器的类转换成列表、字典、有序字典 -> JSON处理

1.1 自定义Serailizer类序列化

from rest_framework import serializers
class 序列化类名(serializers.Serializer):字段 = serializers.类型()...#字段要与数据库中的一致

1.2 在视图APIView中使用

from rest_framework.views import APIView
frrom rest_framework.response import Response
class 视图类名(APIView):1. 获取数据库的数据instance2. 序列化数据ser = 序列化类名(instance = instance,many=True | False)#True是Query_Set,False是数据对像#ser.data才是真正的将数据对象或Query_set转化为JSON格式3.返回JSON数据return Response(ser.data)

关于序列化类many的说明

  • many=False是单个对象的序列化
  • many=True时是Query_set的序列化,它是加了下个for循环,再调用单个对象序列化

1.3 自定义ModelSerializer类序列化

由于序列化时,字段与模型中的字段是一样的,所以将其集中

from from rest_framework.serializers import ModelSerializer
class 自定义ModelSerializer类名(ModelSerializer):class Meta:model = 模型类名fields = [字段类名列表] | "__all__"#所有字段都返回

1.4 不同格式的字段序列化

1.4.1 自定义字段

在modelserializer的字段自定制

from from rest_framework.serializers import ModelSerialize
from from rest_framework.serializers
class 自定义ModelSerializer类名(ModelSerializer):字段 = serailizes.类型(source="数据库的字段")#自定义字段,要在field中添加自定义字段名class Meta:model = 模型类名fields = [字段类名列表] | "__all__"#所有字段都返回

注:

  • source是数据库的字段
  • source支持对象的访问,如obj.字段.外键字段名 | obj.get_字段_display#get_字段_display运行时会自动加上括号
  • 在fields中要添加自定义字段名,可以不与数据名一致

1.source对接的是数据库。2.支持orm对数据库的操作。3.带有函数的不用加括号。

1.4.2 日期自定义格式
from from rest_framework.serializers import ModelSerialize
from from rest_framework.serializers 
class 自定义ModelSerializer类名(ModelSerializer):日期字段 = serailizes.DateTimeField(format="%y-%m-%d") #日期格式显式class Meta:model = 模型类名fields = [字段类名列表] | "__all__"#所有字段都返回
1.4.3 自定义方法字段
from from rest_framework.serializers import ModelSerialize
from from rest_framework.serializers 
class 自定义ModelSerializer类名(ModelSerializer):自定义方法字段 = serailizes.SerializerMethodField()class Meta:model = 模型类名fields = [字段类名列表] | "__all__"#所有字段都返回def get_自定义方法字段(self,obj):obj是对象值retrun 序列化的值
1.4.4 嵌套,针对:一对多,多对多的情况
from from rest_framework.serializers import ModelSerialize
from from rest_framework.serializers class 一对多类名(ModelSerializer):class Meta:model = 模型类名fields = [字段类名列表] | "__all__"#所有字段都返回class 多对多类名(ModelSerializer):class Meta:model = 模型类名fields = [字段类名列表] | "__all__"#所有字段都返回class 自定义ModelSerializer类名(ModelSerializer):一对多字段名 = 一对多类名()多对多字段名 = 多对多类名()class Meta:model = 模型类名fields = [字段类名列表]
1.4.5 继承
from from rest_framework.serializers import ModelSerialize
from from rest_framework.serializers class 继承类名(ModelSerializer):class Meta:model = 模型类名fields = [字段类名列表] | "__all__"#所有字段都返回class 自定义ModelSerializer类名(ModelSerializer,继承类名):class Meta:model = 模型类名fields = [字段类名列表,可以添加自定义类名中的字段]

2. 序列化-源码流程

四、反序列化

1. 反序列化流程

路由-> 视图-> request.data ->校验(序列化器的类)->操作(数据库db,序列化器的类)

2. 数据校验

2.1数据校验是要在视图中校验的。但要在序列化类中写好校验规则。

from rest_framework.views import APIView
frrom rest_framework.response import Response
class 视图类名(APIViewdef post(self,request,*arg,**kwarg)1. 获取数据库的数据2. 数据校验ser = 序列化类名(data = request.data)ser.is_valid()#返回的是True或False业务编写校验通过后,可以能完ser.validated_data获取校验后的数据,返回是OrderadDict数据集。校验失败后,可以能完ser.errors获取错误信息,返回字典{字段:[ErrorDetail(错误提示)]}3.返回JSON数据return Response(ser.data)ser.is_valid(raise_exception=True)#成功可以利用值。抛出异常 raise ValidationError(self.errors)
注:不用判断,直接返回值,或返回错误值。

2.2序列化类校验规则

内置校验规则与正则校验规则

2.2.1内置校验规则

required = True | False 是否必须校验规则。

max_length = nu 最大长度

min_length = nu 最小长度

2.2.2 正则校验规则
var = serializers.CharField(validators=[RegesValidator(正则表达式,messege = "错误提示语!"),])
2.2.3 钩子函数
from rest_framework import serializer
from rest_framework import exceptions
#在序列化式子中编写
class 钩子函数类名(serilizers.Serializer):字段 = serializer.类型()...def validate_字段名(self,value):业务逻辑#value是传过来的值raise exceptions.ValidationError("校验失败时,错误提示语!")return value#也可以改变相关的值,返回给ser.validated_data中相应字段值defm validate(self,attr):attr是ser.validated_data的值所有字段校验通过了,最后校验这个函数。raise excptions.ValidationError("全局钩子校验失败时提示语。")#返回为{"non_field_errors":[ErrorDetail(string='....',code='invalid')]}#api_setting.NON_FIELD_ERRORS_KEYF表示指定全局,错误提示语Key可以setting.py 中添加"NON_FIELD_ERRORS_KEYF":'字符串'return attr#也可以对attr中的字典数据进行操作
2.24 ModelSerializer校验规则
from rest_framework import serializer
from rest_framework import exceptions
#在序列化式子中编写
class 钩子函数类名(serilizers.ModelSerializer):class Meta:model = 数据库名fields = [字段列表] | "__all__"extra_keargs = {字段:{"validators":[RegexValidator(正则,messegs:"错误提示语")]},字段:{内置规则}如:{"max_length":50},...}

在ModelSerializer中model对应的是数据库的字段,但不会把django模型中的限定语句加到序列化类中来,这时我们要自己加。可以用extra_kwargs={

字段:{…}

}

ModelSerializer的主要功能:

  • 可以简化模型字段与序列化字段的编写。
  • 可以将校验通过的数据,直接保存到数据库中。ser.save()
  • ser.save()有两个小问题(字段少了,字段多了)
    • 字段少了,可以在ser.save(少了的字段=value,…)
    • 字段多了,可以用ser.validated_data.pop(字段名)删除多余的字段数据。注:用pop删除后会返回删除的值。也可以用del ser.validated_data.get(字段名),用del 不返回值。
    • 用ser.save()是要序列化validated_data中的字段名与模型中的必存字段要一致。
    • ser没有使用save()时,ser.validated_data中没有id,但保存后就有了id。所以ser.data就可以序列化取值了。
2.2.5 字段属性(read_only,write_only)
  • read_only=Ture表示只序列化,不反序列化。
  • write_only=True表示只反序列化,不序列化。
  • 注:不能同时使用read_only、write_only。
  • 对于嵌套类时,也可以用read_only、write_only。
2.2.6对校验的总结

3.序列化字段与模型字段的总结

  • 序列化与模型取值这二个是独立的过程,模型取出的值后,再与序列化对接。序列化依据模型取出的数来进行操作,得到想要的结果。
  • 序列化时每一个字段依据模型取出的值操作来得到想要的结果。字段要与模型字段为依据来操作,就与source有关。注:默认source与序列化字段一致,特别指定时,可以不一样。为了得到想要的值就拓展了以下方法:
    • source=模型取值操作的方法一样
    • 自定义方法字段 = serailizes.SerializerMethodField()->def get_自定义方法字段(self,value)->返回就是JSON想要的结果。(注:默认read_only=True)
    • 嵌套类->使用时要关联模型类字段如:source=关联模型类字段
  • 反序列化与模型存值这二个是独立的过程,先获得前端传来的数据request.data.再校验->校验的过程,其实就是将取到的值与自身的校验规则是否合法,如果合法相应字段再与模型实例化,注模型实例化可以少字段。这就带来两个问题,反序列化的字段多了或少了。多了、少了都不能存入数据库中。所以要注意以下三个方面:
    • 多了要删除,可以看前面的(ModelSerializer的主要功能)
    • 少了要添加,可以看前面的(ModelSerializer的主要功能)
    • 保证ser.validated_data与模型中必存字段一致。

其实反序列化——>数据校验——>数据存储与模型数据存储是两个过程。它们只用ser.save()连结起来了。

3.1 对于chioces与序列化、反序列化、模型字段名一致

from collections import OrdereDict
from rest_framework.fields import SkipField
from rest_framework.relations import PKOnlyObjectclass NbHookSerializer(object):def to_representation(self,instance):ret = OrderedDcit()fields = self._readable_fieldsfor field in fields:if hasattr(self,"nb_%s"% field.field_name):value = getattr(self,'nb_%s'%field.field_name)(instance)ret[field.field_name] = valueelse:try:attribute = field.get_attribute(instance)except SkipField:continuecheck_for_none = attribute.pk if isinstance(attribute,PKOnlyObject) else attributeif check_for_none is None:ret[field.field_name] = Noneelse:ret[field.field_name] = field.to_representation(attribute)return ret

使用时,可以用类的继承-在写序列化时使用。继承要注意,要写在先,因为类的继承优先级是先到后。

4. 数据校验-源码流程

五、模型查询的常规操作

  1. 对象.get_字段_display() #chioces显示后面的字段
  2. 对象.字段.字段#针对于一对多、多对多的情况
  3. filter(id__in=id列表)对于多个值的查询
  4. 对象添加值->对象.字段.set([id列表])#多对多的情况使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/803620.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于opencv的视觉巡线实现

前言 这段时间在和学弟打软件杯的比赛,有项任务就是机器人的视觉巡线,这虽然不是什么稀奇的事情,但是对于一开始不了解视觉的我来说可以说是很懵了,所以现在就想着和大家分享一下,来看看是如何基于opencv来实现巡线的…

34. UE5 RPG实现鼠标点击移动

在前面,我们实现过使用键盘按键wasd去实现控制角色的移动,现在,我们实现了InputAction按键触发,后面,实现一下通过鼠标点击地面实现角色移动。 我们将实现两种效果的切换,如果你点击地面快速松开&#xff0…

LeetCode 289.生命游戏————2024 春招冲刺百题计划

根据 百度百科 , 生命游戏 ,简称为 生命 ,是英国数学家约翰何顿康威在 1970 年发明的细胞自动机。 给定一个包含 m n 个格子的面板,每一个格子都可以看成是一个细胞。每个细胞都具有一个初始状态: 1 即为 活细胞 &am…

鹅厂实习offer

#转眼已经银四了,你收到offer了吗# 本来都打算四月再投实习了,突然三月初被wxg捞了(一年前找日常实习投的简历就更新了下),直接冲了,流程持续二十多天,结果是运气还不错,应该是部门比…

2024年光学通信和物联网、自动化控制和大数据国际会议(OCITACB2024)

2024年光学通信和物联网、自动化控制和大数据国际会议(OCITACB2024) 会议简介 2024年国际光通信与物联网、自动控制和大数据会议(OCITACB2024)的主要目标是促进光通信与物联网、自动管理和大数据领域的研发活动。另一个目标是促进研究人员、开发人员、工…

用three.js做一个3D汉诺塔游戏(下)

为桌台添加材质纹理 为物体添加适当的材质纹理,可以使其视觉效果产生质的飞跃。接下来,我们将为桌台添加一种木质纹理,用到的纹理贴图来自Pixabay.com。 我们使用 TextureLoader 来加载纹理贴图,其 load 方法第1个参数为贴图的 URL 字符串,该方法返回一个纹理对象,可直…

Linux服务器上搭建深度学习环境(安装anaconda、创建虚拟环境、安装pytorch)

Linux服务器的搭配 Linux服务器上安装anaconda创建虚拟环境linux上安装pytorchxshell连接服务器 Linux服务器上安装anaconda 链接 创建虚拟环境 参考教程:此处 linux上安装pytorch 链接 xshell连接服务器 链接

科技动态人工智能应用太空探索生物科技

根据最新的科技资讯,以下是一些值得关注的科技动态: 人工智能领域 智能体热潮 :随着大模型的研发热潮,AI智能体的发展迅速,它们被用作认知核心,具备强大的学习和迁移能力。智能体的架构和交互方式也在不断进…

python课后习题三

题目&#xff1a; 解题过程&#xff1a; 模式A&#xff1a; num int(input("&#xff08;模式A&#xff09;输入数字&#xff1a;")) for i in range(num): for j in range(num): if j < i 1: …

MQ的延迟队列

1&#xff0c;场景 1.定时发布文章 2.秒杀之后&#xff0c;给30分钟时间进行支付&#xff0c;如果30分钟后&#xff0c;没有支付&#xff0c;订单取消。 3.预约餐厅&#xff0c;提前半个小时发短信通知用户。 A -> 13:00 17:00 16:30 延迟时间&#xff1a; 7*30 * 60 * …

Excel·VBA考勤打卡记录整理

看到一个帖子《excel吧-考勤一天四次打卡&#xff0c;快速找出缺卡》&#xff0c;每个人每天有4次打卡记录&#xff0c;需要整理出所有缺少的打卡记录 与之前的文章《ExcelVBA考勤打卡记录统计结果》结果形式类似 与之前的文章《ExcelVBA考勤打卡记录数据整理》查找上下班打卡…

Linux、Docker、Brew、Nginx常用命令

Linux、Docker、Brew、Nginx常用命令 Linuxvi编辑器文件操作文件夹操作磁盘操作 DockerBrewNginx参考 Linux vi编辑器 Vi有三种模式。命令模式、输入模式、尾行模式&#xff0c;简单的关系如下&#xff1a; i -- 切换到输入模式&#xff0c;在光标当前位置开始输入文本。&a…

【go从入门到精通】初识struct结构体

作者简介&#xff1a; 高科&#xff0c;先后在 IBM PlatformComputing从事网格计算&#xff0c;淘米网&#xff0c;网易从事游戏服务器开发&#xff0c;拥有丰富的C&#xff0c;go等语言开发经验&#xff0c;mysql&#xff0c;mongo&#xff0c;redis等数据库&#xff0c;设计模…

虚拟网络设备性能优化

在现代网络架构中&#xff0c;虚拟网络设备扮演着越来越重要的角色&#x1f310;&#xff0c;特别是在云计算☁️和容器化技术&#x1f4e6;广泛应用的背景下。虚拟网络设备如虚拟以太网设备&#xff08;veth&#xff09;、虚拟交换机&#xff08;vSwitch&#xff09;、和虚拟路…

适用于 Mac 的 10 大数据恢复工具,具有优点、缺点

数据丢失很常见&#xff0c;并且可能由于许多不同的原因而发生。这种情况在我和我们团队的其他成员身上发生过很多次&#xff0c;即使我们格外小心我们的个人存储设备。 幸运的是&#xff0c;数据恢复软件在大多数情况下都可以工作。但是&#xff0c;由于数据丢失场景彼此之间…

【CKA模拟题】边车容器Shared-Volume的具体用法

Useful Resources: Persistent Volumes Claim , Pod to Use a PV 题干 For this question, please set this context (In exam, diff cluster name) kubectl config use-context kubernetes-adminkubernetes An existing nginx pod, my-pod-cka and Persistent Volume Claim…

macOS制作C/C++ app

C/C制作macOS .app 一、 .app APP其实是一个文件夹结构&#xff0c;只不过mac的界面中让它看起来像一个单独的文件。 在shell终端或者右键查看包结构即可看到APP的目录结构。 通常的app目录结构如下&#xff1a; _CodeSignature, CodeResources 一般为Mac APP Store上架程序…

【aws】在DBeaver上用终端节点连接Redshift

碎碎念 最近想要尝试redshift的一个叫做重新定位的功能&#xff0c;重新定位触发之后会停止当前的集群&#xff0c;转而在同一个区域的另一个可用区中启动一个一样的集群&#xff0c;这个过程视情况会花上10到60分钟不等。 但是目前项目中连接到redshift用的是私有ip&#xf…

保研线性代数复习4

一.范数&#xff08;Norms&#xff09; 1.什么是范数&#xff1f; 范数是一个向量空间V的函数&#xff0c;每一个属于向量空间V的向量x都匹配了一个实数&#xff08;它的长度&#xff09;&#xff1a; 2.范数的性质&#xff1f; 齐次性&#xff1a; 正定性&#xff1a; 三…

大创项目推荐 深度学习 机器视觉 车位识别车道线检测 - python opencv

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习 机器视觉 车位识别车道线检测 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f947;学长这里给一个题目综合评分(每项满分5分) …