DRF的序列化【2】

【0】前提概要

【1】基于 View + JsonResponse 编写的 5 个接口:

  1. 序列化自定义处理: 你需要自己编写序列化逻辑。
  2. 处理 JSON 格式的 POST 请求数据: 从 request.body 中获取数据,并使用 json.loads() 解析成字典,然后创建相应的对象。
  3. request.POST 和 QueryDict 的区别: request.POST 返回的是 Django 的 QueryDict 对象,与真正的 Python 字典有些差别。您可以通过 request.POST.dict() 方法将其转换为纯字典。
  4. 处理 PUT 请求的数据: PUT 请求的数据不会像 POST 请求那样自动放在 request.PUT 中,您需要自己从 request.body 中提取数据,并进行必要的解析(例如,URL 编码和解码)。
  5. 禁用 CSRF 校验: 注释掉 CSRF 校验,可以在视图函数或者中间件中进行。
	-1 序列化需要自己做
    -2 post提交数据,如果是json格式,在request.POST取不到数据--》request.body
    	dic=json.loads(request.body) # request.body  bytes格式
        Book.objects.create(**dic)
    -3 **request.POST--->QueryDict-->跟真正字典有差距
    	request.POST.get('name')  # {name:[lqz,justin]}
        request.POST['name']
        request.POST.getlist('name')
        看源码:from django.http.request import QueryDict
        request.POST.dict()--->纯字典--**
        
    -4 put请求请求体中的数据--》不会放在request.PUT-->自己从body中转--》url编码和解码
    	django.core.handlers.wsgi.WSGIRequest
    -5 注释掉csrf

【2】基于 APIView + Response 编写的 5 个接口:

  1. 禁用 CSRF 校验: 可以通过在视图函数中使用 @csrf_exempt 装饰器来禁用 CSRF 校验。
  2. 使用装饰器包装视图函数: 您可以编写一个装饰器函数,在其中调用视图函数,并在装饰器中处理一些通用的逻辑,例如异常处理或者权限验证。
	-1 没有csrf校验了---@wrapper
        def index()
		--------------
        wrapper(index)

【3】基于 APIView + Response + 序列化类 编写的 5 个接口:

  1. 编写序列化类: 您需要编写一个继承自 serializers.Serializer 的序列化类,定义需要序列化的字段。
  2. 反序列化校验: 你可以通过字段自定义校验、局部钩子或全局钩子来实现反序列化时的数据校验。
  3. 反序列化保存: 在校验通过后,可以调用序列化器的 save 方法来保存数据,可以根据 instance 的有无来判断是创建新对象还是更新现有对象。
	-1 序列化:写个序列化类,继承Serializer--》写字段--》在视图类中实例化得到对象--》instance,data--》ser.data
    serializer.dat ---> 不是json格式字符串 ---> 字典或者列表 ---> Response ----> json格式字符串
    -2 反序列化校验:(从上往下)
    	-1 字段自己的
        -2 局部钩子  返回值
        -3 全局钩子  返回值
    -3 反序列化保存
    	-1 校验过后 ser.save --->修改,新增
        -2 序列化列中重写 create和update--》都是调用save,但是根据instance有没有决定触发create还是update

【一】全局钩子跟局部钩子

​ 全局钩子(Global Hooks)和局部钩子(Local Hooks)通常是指在软件开发中使用的两种不同类型的钩子机制。

【1】全局钩子

  • 全局钩子是在整个应用程序中生效的钩子,它们会影响应用程序的所有部分。
  • 全局钩子通常用于在应用程序启动或某个特定事件发生时执行某些操作,例如在每个 HTTP 请求处理之前或之后执行某些代码。
  • 在 Web 开发中,全局钩子通常是通过中间件(Middleware)实现的。中间件可以拦截 HTTP 请求和响应,允许开发者在处理请求之前或之后执行自定义代码。
  • 例如,在 Django 中,可以编写中间件来实现全局钩子,这些中间件可以在请求处理的不同阶段执行自定义操作,如身份验证、日志记录等。

全局钩子示例(使用 Django 中间件)

  • 在目录下创建 middleware.py

class RequestLoggingMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        # 在请求处理之前执行的代码
        # 记录请求信息到日志文件
        logger.info(f"Request: {request.method} {request.path}")

        response = self.get_response(request)

        # 在请求处理之后执行的代码
        return response

  • 然后,在 Django 的设置文件中注册这个中间件:

    # settings.py
    
    MIDDLEWARE = [
        # 其他中间件...
        'task_api.middleware.RequestLoggingMiddleware',
    ]
    

【2】局部钩子

  • 局部钩子是针对特定组件或功能的钩子,只在特定的代码段或功能范围内生效。
  • 局部钩子通常用于在特定事件发生时执行某些定制逻辑,例如在模型保存之前或之后执行一些操作。
  • 在软件开发中,局部钩子可以通过回调函数、事件监听器或钩子函数等方式实现。
  • 例如,在 Django 的模型中,可以利用信号(Signals)实现局部钩子,通过监听模型的特定事件(如 pre_savepost_save 等),在事件发生时执行相应的操作。
from rest_framework import serializers
from rest_framework.exceptions import ValidationError
from Api01.models import Book


class BookSerializer(serializers.Serializer):
    name = serializers.CharField()
    price = serializers.IntegerField()
    publish = serializers.CharField()

    # 局部钩子
    # 1 数据校验第一层,字段自己校验
    # 2 书名不能以sb开头--》局部钩子函数--》给某个字段加限制条件
    def validate_name(self, name):
        # if name.startswith('sb'):
        if 'jni' in name:
            # 不合法,抛异常
            raise ValidationError('书名不能以jni开头')
        else:
            # 合法,返回原来的数据
            return name

小结:

​ 总的来说,全局钩子用于影响整个应用程序的行为,而局部钩子用于在特定场景下执行定制化逻辑。在设计和开发应用程序时,合理地使用全局钩子和局部钩子可以提高代码的灵活性和可维护性。

​ 对单个字段进行校验的方法是局部钩子,而对多个字段进行校验的方法是全局钩子。

【二】APIView源码执行流程

【1】执行流程

​ 当你使用 Django REST Framework 中的 APIView 类时,它提供了一个用于处理 HTTP 请求的类视图,允许你自定义逻辑来响应不同类型的请求(如 GET、POST、PUT、DELETE 等)。让我们来看一下 APIView 的源码执行流程,并结合具体示例来解释:

  1. 初始化视图类:当你定义一个继承自 APIView 的类视图时,首先会创建这个类的实例对象。在这个阶段,会执行类的初始化方法 __init__
  2. 请求分发:当有请求到达时,Django 框架会根据请求的方法(GET、POST、PUT 等)调用对应的方法处理请求。APIView 类中提供了一系列方法来处理不同类型的请求,如 get()post()put()delete() 等。
  3. 请求前处理(dispatch):在调用对应的请求处理方法之前,会先调用 dispatch() 方法进行一些通用的请求预处理操作。这个方法可以被子类重写以添加自定义的请求预处理逻辑。例如,你可以在这个方法中进行身份验证、权限检查等操作。
  4. 请求处理:根据请求的 HTTP 方法,调用对应的请求处理方法,例如 get()post()put()delete() 等。
  5. 请求后处理:在请求处理方法执行完毕后,会进行一些请求后处理操作,比如返回响应数据、设置响应头等。
  6. 返回响应:请求处理方法执行完毕后,会返回一个响应给客户端。
  7. 结束:整个请求处理过程结束。
	-1 请求来:BookView.as_view()(request)-->APIView的as_view--》去除了csrf--》其它跟之前一样(super.super().as_view)--->最终本质就是执行--》self.dispatch-->self 是视图类的对象--》找到APIView的dispatch
    -2 APIView的dispatch
      def dispatch(self, request, *args, **kwargs):
  		# 1 包装新的request--》从此后,request就是新的了
        request = self.initialize_request(request, *args, **kwargs)
        # 2 request新的request放到了self.request中了 【self是视图类的对象】
        self.request = request
		
        try:
            # 3 执行三大认证
            self.initial(request, *args, **kwargs)
            #self.perform_authentication(request)
            #self.check_permissions(request)
            #self.check_throttles(request) 

            # 3 执行跟请求方式同名的方法
            if request.method.lower() in self.http_method_names:
                handler = getattr(self, request.method.lower(),
                                  self.http_method_not_allowed)
            else:
                handler = self.http_method_not_allowed
			# drf的Response
            response = handler(request, *args, **kwargs)

        except Exception as exc:
            # 4 统一处理一场--》统一返回格式
            response = self.handle_exception(exc)

        self.response = self.finalize_response(request, response, *args, **kwargs)
        return self.response

【2】drf 配置文件之查找顺序

在apiView中使用了drf配置文件的默认配置。以下是配置的查找顺序。

'''方式三:查找顺序(一般就用内置的即可)
     1. 视图类  (局部配置)
     2. django settings  (全局配置) 
     3. drf api_settings (内置配置)
说明:
优先使用视图类中renderer_classes的配置,其次使用django项目配置文件settings中的配置,最后使用drf内置的api_settings的配置'''

在django的settings中应该按照如下格式写:

REST_FRAMEWORK = {
    'DEFAULT_RENDERER_CLASSES': [    # 配置响应
        'rest_framework.renderers.JSONRenderer',
        'rest_framework.renderers.TemplateHTMLRenderer',
    ],
    'DEFAULT_PARSER_CLASSES': [  # 配置请求
        'rest_framework.parsers.JSONParser',
        'rest_framework.parsers.FormParser',
        'rest_framework.parsers.MultiPartParser',
    ],
}
# 注意:所有配置都写在一个REST_FRAMEWORK里面!

【三】drf之请求

【1】APIView之请求相关配置

# 为什么需要进行请求相关配置?
可以定制某些CBV只能只能接收json格式,不能接收其他格式。也就是为了自定义该接口可接受编码格式。

# 默认情况下
前端上传json                  request.data里面是   ---> python字典
前端上传urlencode\formdata    request.data里面是   ---> QueryDict


# 方式一,在继承自APIView及其子类的的视图类中配置(局部配置)
# 总共有三个:from rest_framework.parsers import JSONParser,FormParser,MultiPartParser
class BookView(APIView):
    parser_classes = [JSONParser,]
    
# 方式二:在配置文件中配置(影响所有,全局配置)
    -django有套默认配置,每个项目有个配置
    -drf有套默认配置,每个项目也有个配置---》就在django的配置文件中
    REST_FRAMEWORK = {
    'DEFAULT_PARSER_CLASSES': [
        # 'rest_framework.parsers.JSONParser',
        'rest_framework.parsers.FormParser',
        # 'rest_framework.parsers.MultiPartParser',
    ],
}
       
# 方式三:全局配了1个,某个视图类想要3个,怎么配?
    -只需要在视图类,配置3个即可
    -因为:先从视图类自身找,找不到,去项目的drf配置中找,再找不到,去drf默认的配置找
    
# 视图类方法中的request
    -data
    -__getattr__
    -query_params

【四】drf之响应

【1】APIView之响应相关配置

# 为什么要在CBV中设置响应相关配置?
因为对于drf的响应,如果使用浏览器和postman访问同一个接口,Response返回的格式是不一样的
	-drf做了个判断,如果是浏览器,好看一些,如果是postman只要json数据
    
    
# 方式一:在视图类中写(局部配置)
	-两个响应类---》找---》drf的配置文件中找--》两个类
    -from rest_framework.renderers import JSONRenderer,BrowsableAPIRenderer
    class BookView(APIView):
    	renderer_classes=[JSONRenderer,]

# 方式二:在项目配置文件中写(全局配置)
    REST_FRAMEWORK = {
      'DEFAULT_RENDERER_CLASSES': [
        'rest_framework.renderers.JSONRenderer',
        'rest_framework.renderers.BrowsableAPIRenderer',
    ],
}
    
# 方式三:使用顺序(一般就用内置的即可)
     1. renderer_classes
     2. django settings
     3. drf api_settings
说明:
优先使用视图类中renderer_classes的配置,其次使用django项目配置文件settings中的配置,最后使用drf内置的api_settings的配置

【2】Response对象属性

# drf 的Response 源码分析
    -from rest_framework.response import Response
    -视图类的方法返回时,retrun Response ,走它的__init__, init中可以传什么参数
    -Responses最终继承httpresponse.
    
    
# Response init可以传的参数
    def __init__(self, 
                 data=None, 
                 status=None,
                 template_name=None, 
                 headers=None,
                 exception=False, 
                 content_type=None)
    
   -data:之前咱们写的ser.data  可以是字典或列表,字符串---》序列化后返回给前端---》前端在响应体中看到的就是这个 

   -status: http响应的状态码,默认是200,你可以改
        -drf在status包下,把所有http响应状态码都写了一遍,常量
        -from rest_framework.status import HTTP_200_OK
        -Response('dddd',status=status.HTTP_200_OK)
      
   -template_name:了解即可,修改响应模板的样子,BrowsableAPIRenderer定死的样子,后期公司可以自己定制

   -headers:响应头,http响应的响应头 示例:header={'xxx':'yyy'}
    
   -content_type :响应编码格式,一般不动
   
# 重点:data,status,headers

# 原生djagno,如何在响应头中加东西?

           '''
           四件套 render,redirect,HttpResponse,JsonResponse
           方法: 产生HttpResponse然后添加属性
           '''
         # 示例:
            obj = HttpResponse('dddd')
            obj['xxc'] = 'yyc'
            return obj
        
         响应头添加属性涉及知识 ---> 跨域 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JS基础:变量的详解

你好,我是云桃桃。 一个希望帮助更多朋友快速入门 WEB 前端的程序媛。 云桃桃,大专生,一枚程序媛,感谢关注。回复 “前端基础题”,可免费获得前端基础 100 题汇总,回复 “前端基础路线”,可获取…

基于51单片机NEC协议红外遥控发送接收proteus仿真设计

1.主要功能: 设计一个51单片机红外遥控发射接收proteus仿真设计 功能要求: 1、使用单片机模拟红外遥控器发射红外编码; 2、利用从机接收红外编码,并将编码以16进制显示到数码管上。 需注意仿真中51单片机芯片是兼容的&#x…

Web网页项目实战-----小兔鲜儿项目

本网站是一个电商网站,主要由Html、CSS、JS来完成,实现的功能主要是可以购买产品,展示产品,查看订单等功能,效果如下,如有需要项目代码的可以私信我,或者文章底下评论,我给分享原项目…

爬虫学习(2)破解百度翻译

代码 import requests import jsonif __name__ "__main__":url https://fanyi.baidu.com/sug#post请求参数处理(同get请求一致)headers {"User-Agent": Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, …

【C语言】第一个C程序:hello world

printf简介 printf是C语言提供的库函数,可以在屏幕上打印格式化数据。这里不作展开,只需要知道,如果要打印hello world,就把双引号引起来的"hello world"作为参数传给printf就行了。如果想要在打印后换行,要…

【Linux】冯·诺依曼体系结构

要想谈进程,我们就不能只谈进程,我们如果想搞清楚什么是进程,就要从操作系统讲起。我们现在的不管是Linux或是Windows或是安卓等操作系统,它们都有一个相同点,那就是遵循冯诺依曼体系结构,我们看一下冯诺依…

如何让你的排单更快?

一般我们都喜欢做打板借用快速通道!但是目前快速通道也是共享通道,独立单元格基本不开发。 想要排单更快,想要隔夜打板,我们到底应该怎么做呢? 想要排单更快,说白了就是要提高你的交易速度!一&a…

ai写作工具推荐:如何用AI人工智能进行写作

AI写作工具:提升创作效率的秘密武器 在科技日新月异的今天,人工智能(AI)已经渗透到我们生活的方方面面,包括写作。AI写作工具,就是利用人工智能技术,帮助我们进行文本生成、语言优化等工作的工…

使用C语言实现杨氏矩阵并找出数字

前言 过了五一假期,咋们经过了一个假期的休息,要继续学习了,不能偷懒哦!! 今天让我们来看看如何在一个杨氏矩阵中找出自己想找到的数字。 首先,我们要了解一下杨氏矩阵到底是什么,如果一个矩阵中…

语音识别简介

⚠申明: 未经许可,禁止以任何形式转载,若要引用,请标注链接地址。 全文共计3077字,阅读大概需要3分钟 🌈更多学习内容, 欢迎👏关注👀【文末】我的个人微信公众号&#xf…

Android关于SparseArray面试题

问题1: 什么是SparseArray&#xff0c;它与HashMap有什么不同&#xff1f; 回答&#xff1a; SparseArray是一个用于优化特定情况下内存使用的数据结构&#xff0c;主要用于替代HashMap<Integer, Object>。SparseArray使用两个数组分别存储键和值&#xff0c;而不是使用…

最原理的一集——Mathtype公式编号设置(Mathtype7.8+Word)

版本 Mathtype7.8Office2019 Word 读完本文你将会 随心所欲&#xff0c;想怎么给公式编号就怎么给公式编号&#xff0c;想从(X.1)开始&#xff0c;就从(X.1)开始大概了解Mathtype公式设置原理给作者点赞 如果你想自己跟着文章做的话 请不要在自己的论文里边直接操作&#…

Docker私有仓库与Harbor部署使用

目录 一、本地私有仓库 1. 下载registry镜像 2. 在daemon.json文件中添加私有镜像仓库地址 ​编辑 3. 运行registry容器 4. Docker容器的重启策略如下 5. 为镜像打标签 6. 上传到私有仓库 7. 列出私有仓库的所有镜像 8. 列出私有仓库的centos镜像有哪些tag 9. 先删…

zTasker v1.88.1一键定时自动化任务

软件介绍 zTasker是一款完全免费支持定时、热键或条件触发的方式执行多种自动化任务的小工具&#xff0c;支持win7-11。其支持超过100种任务类型&#xff0c;50种定时/条件执行方法&#xff0c;而且任务列表可以随意编辑、排列、移动、更改类型&#xff0c;支持任务执行日志&a…

分布式锁之RedissonLock

什么是Redisson&#xff1f; 俗话说他就是看门狗&#xff0c;看门狗机制是一种用于保持Redis连接活跃性的方法&#xff0c;通常用于分布式锁的场景。看门狗的工作原理是&#xff1a;当客户端获取到锁之后&#xff0c;会对Redis中的一个特定的键设置一个有限的过期时间&#xff…

投资海外标的,首选跨境ETF!现在新开佣金低至万0.5!

全球资产配置的利器 随着经济的发展&#xff0c;全球资产配置成为中产阶级的关注方向。目前&#xff0c;全球资产配置的主要渠道包括直接开立境外账户、 QDII 基金、跨境 ETF 等。 现阶段通过跨境 ETF 投资境外股市是最便利、最具效率的方式之一。首先&#xff0c;与直接境外…

4. RedHat认证-进程管理

4. RedHat认证-进程管理 1.进程概念 进程就是正在运行中的程序或者命令 每一个进程都是运行的实体&#xff0c;都有自己的地址空间&#xff0c;并占有一定的资源空间 程序消耗的是磁盘资源、进程消耗的是内存和CPU资源 进程会占用四类资源&#xff08;CPU 、内存、磁盘、网…

会声会影电影片头怎么做 会声会影电影质感调色技巧 会声会影视频制作教程 会声会影下载免费中文版

片头通常通过一系列的图像、音乐和文字等元素来引入电影的主题和氛围。通过视觉和音频的呈现方式&#xff0c;给观众留下深刻的第一印象&#xff0c;为电影的故事铺设基础。这篇文章来学习一下会声会影电影片头怎么做&#xff0c;会声会影电影质感调色技巧。 一、会声会影电影…

力扣每日一题-拆炸弹-2024.5.5

力扣题目&#xff1a;拆炸弹 题目链接: 1652.拆炸弹 题目描述 代码思路 根据代码实现分为k等于0和k不等于0的情况。k等于0很容易处理&#xff0c;而k不等于0时&#xff0c;需要使用滑动窗口的方式来解决。先根据小于0或大于0确定一个窗口&#xff0c;然后移动&#xff0c;获…

【数据结构与算法】之五道链表进阶面试题详解!

目录 1、链表的回文结构 2、相交链表 3、随机链表的复制 4、环形链表 5、环形链表&#xff08;||&#xff09; 6、完结散花 个人主页&#xff1a;秋风起&#xff0c;再归来~ 数据结构与算法 个人格言&#xff1a;悟已往之不谏&#xff0c;知…
最新文章