drf之请求、drf之响应、两个视图基类、5个视图扩展类(不是视图类)、原生django,怎么写向响应头写入数据

1 drf之请求

1.1 drf 之请求Request类

# 新的request对象---》之前聊过一部分# from rest_framework.request import Request# 1 以后视图类的方法中的request都是这个类的对象
# 2 以后使用request.data  取请求体中的数据
# 3 以后使用request.query_params  取请参数中的数据
# 4 以后其他属性,用起来跟之前一样---》重要-request.method 的时候---》实际上 request._request.'method'---》反射出来的-这个类from rest_framework.request import Request没有method,他会触发这个类的__getattr__---# 5 FILES 用起来跟之前一样,前端传入的文件在里面## 了解:request._request视图类的方法中:  self 是咱们写的视图类的对象,self.request 是新的request

1.2 控制前端请求的编码格式

前端传入的编码:urlencoded,josn,form-data# 某些接口只能接收某种编码的处理方式#### 方式一:局部使用---》视图类上配置---》优先用它
class BookView(APIView):  # 视图类内的所有方法,只能接收json格式parser_classes = [JSONParser]### 方式二:全局都生效---》所有接口都支持某一种或某几种REST_FRAMEWORK = {'DEFAULT_PARSER_CLASSES': ['rest_framework.parsers.JSONParser','rest_framework.parsers.FormParser',# 'rest_framework.parsers.MultiPartParser']
}#### 补充, 方式二:编码格式全局使用,以及浏览器和postman的相应编码格式
REST_FRAMEWORK = {'DEFAULT_PARSER_CLASSES': ['rest_framework.parsers.JSONParser','rest_framework.parsers.FormParser','rest_framework.parsers.MultiPartParser'],'DEFAULT_RENDERER_CLASSES': ['rest_framework.renderers.JSONRenderer','rest_framework.renderers.BrowsableAPIRenderer',],
}### 全局使用后,局部再限制---》只需要在视图类上加即可
class BookView(APIView):  # 全局如果用了,局部这样配,优先用局部的,也就是这个类管理的接口,只能接收form-data格式parser_classes = [MultiPartParser]#### 为什么我们没有配置,三种也支持-drf自己有默认配置---》默认配置就是支持三种

代码解读

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.parsers import JSONParser, FormParser, MultiPartParser
from rest_framework.renderers import JSONRenderer, BrowsableAPIRenderer# JSONParser: 解析json格式
# FormParser:解析urlencoded格式
# MultiPartParser:解析form-data格式class BookView(APIView):'''# 方式二:编码格式全局使用,以及浏览器和postman的响应编码格式REST_FRAMEWORK = {# 全局配置编码格式'DEFAULT_PARSER_CLASSES': ['rest_framework.parsers.JSONParser','rest_framework.parsers.FormParser','rest_framework.parsers.MultiPartParser'],# 全局配置响应编码格式'DEFAULT_RENDERER_CLASSES': ['rest_framework.renderers.JSONRenderer','rest_framework.renderers.BrowsableAPIRenderer',],}'''# 类属性 -----> parser是解析的意思# 方式一:局部使用:视图类上配置编码格式,优先用局部的# 如果以后这个视图类的所有方法,只能接收json格式的数据,别的接收不了,# 只需要在 parser_classes 中传入 JSONParser# parser_classes = [JSONParser]# 如果在setting.py中配置了全局,这里没有使用局部配置,就用全局的# 或者在布局重新配置parser_classes = [JSONParser, FormParser, MultiPartParser]# 响应编码格式renderer_classes = [JSONRenderer, BrowsableAPIRenderer]def get(self, request):# self 就是BookView的对象print(self.request is request)  # Trueprint(self.headers)  # {'Allow': 'GET, POST, HEAD, OPTIONS', 'Vary': 'Accept'}'''def __init__(self, data=None, status=None, template_name=None, headers=None,exception=False, content_type=None):data=None             # 字符串,列表,字典------> 放在了响应体中------>它是__init__()的第一个参数status=None           # 这是http响应状态码,默认是200,不能使用status=100,这表示请求正在处理template_name=None    # 模板名字默认是:rest_framework/api.html  可以定制自己返回的页面headers=None          # http响应头,后期我们往响应头中放数据exception=False     content_type=None     # 响应编码格式     '''res = Response(data={}, status=200, headers={'xxx': 'yyyy'})print(res.data)print(res.has_header('xxx'))  # Truereturn resdef post(self, request):# 请求体中带数据 ------> http请求有请求地址:请求头、请求体# 带在请求体中的数据,有编码格式:3种 ------> 无论是哪种,携带的数据都是从 request.data 中获取# 假设这个接口,只允许携带 json 格式,其他格式都报错,怎么做呢?# 需要配置类属性print(request.data)return Response('新增')

2 drf之响应

2.1 drf之Response对象源码

# from rest_framework.response import Response
### __init__ 中需要传这几个参数,不传也可以
data=None   # 字符串,列表,字典----》放在了响应 体 中 ---》第一个参数是它
status=None, # http响应状态码,默认是200,千万不能写成1xx
headers=None, # http响应头,后期我们可以往响应头中放数据content_type=None # 响应编码格式(不用管,用浏览器访问就是:text/html,用postman就是:json格式)
template_name=None   # 模版名字  默认是:rest_framework/api.html  了解,可以定制自己返回的页面样子### 原生django,向响应头写入数据###补充:后面会用---》通过res.data 就能取到当时放的datga
res=Response(data={},status=500,headers={'xxx':'yyy'})
print(res.data)
return res### 补充:取当时放的响应头
res.headers 拿不到数据,可以通过下面的方式或得到
print(res['xxx'])
print(res.has_header('zzz'))

2.2 drf之响应格式

# 响应有编码格式:默认支持json和text/html(浏览器)# 修改只支持json
### 局部使用
class BookView(APIView):renderer_classes = [BrowsableAPIRenderer]
### 全局使用
REST_FRAMEWORK = {'DEFAULT_RENDERER_CLASSES': ['rest_framework.renderers.JSONRenderer','rest_framework.renderers.BrowsableAPIRenderer',],
}##局部禁用---》全局已经配置了---》局部想用浏览器的样子
class BookView(APIView):renderer_classes = [BrowsableAPIRenderer]# 如果不配置---》有默认-解析:三种编码都能解析-响应:浏览器访问看到浏览器的样子,postman访问,看到json格式

3 两个视图基类

# Book 的 5个接口  基于APIView编写
# Publish 的5个接口  基于GenericAPIView编写

3.1 基于 APIView写接口

class BookView(APIView):def get(self, request):book_list = Book.objects.all()ser = BookSerializer(instance=book_list, many=True)return Response(ser.data)def post(self, request):ser = BookSerializer(data=request.data)if ser.is_valid():ser.save()  # 反序列化保存return Response(ser.data)  # 创建成功后,返回创建后的对象, 做了个序列化else:return Response(ser.errors)class BookDetailView(APIView):def get(self, request, pk):book = Book.objects.filter(pk=pk).first()ser = BookSerializer(instance=book)return Response(ser.data)def put(self, request, pk):book = Book.objects.filter(pk=pk).first()ser = BookSerializer(instance=book, data=request.data)if ser.is_valid():ser.save()return Response(ser.data)else:return Response(ser.errors)def delete(self, request, pk):Book.objects.filter(pk=pk).delete()return Response('')

3.2 基于GenericAPIView(只要跟数据库打交道)

自己写GenericAPIView

class GenericAPIView(APIView):queryset = Noneserializer_class = Nonedef get_queryset(self):return self.queryset.all()  # 真正使用的时候,再加all获取所有才行def get_serializer(self, *args, **kwargs):return self.serializer_class(*args, **kwargs)def get_object(self, pk):res = self.get_queryset()return res.filter(pk=pk).first()

GenericAPIView 有类属性和方法

    	### 重要属性### -queryset:以后放所有某个表查询出的数据-serializer_class:要序列化的类### 重要方法###-get_queryset  :要序列化的所有数据,qs对象-get_serializer :序列化类-get_object  :修改,查询的单条## 了解类属性:-lookup_field = 'pk'  路由使用转换器,转换出来的参数,查询单条要用到,如果改了,路由对应也要修改,一般不改-filter_backends:后面详细讲     过滤 功能-pagination_class :后面详细讲  分页### 了解方法-get_serializer_class  后期咱们可能会重写它,指定某些方法使用不同的序列化类-filter_queryset 后面跟过滤功能一起讲###代码class PublishView(GenericAPIView):queryset = Publish.objects.all()  # 类只要加载,就会执行,查了所有数据,不能以它为准serializer_class = PublishSerializerdef get(self, request):obj_list = self.get_queryset()  # 以用的时候为准ser = self.get_serializer(instance=obj_list, many=True)return Response(ser.data)def post(self, request):ser = self.get_serializer(data=request.data)if ser.is_valid():ser.save()  # 反序列化保存return Response(ser.data)  # 创建成功后,返回创建后的对象, 做了个序列化else:return Response(ser.errors)class PublishDetailView(GenericAPIView):serializer_class = PublishSerializerqueryset = Publish.objects.all()def get(self, request, pk):obj = self.get_object()ser = self.get_serializer(instance=obj)return Response(ser.data)def put(self, request, pk):obj = self.get_object()ser = self.get_serializer(instance=obj, data=request.data)if ser.is_valid():ser.save()return Response(ser.data)else:return Response(ser.errors)def delete(self, request, pk):self.get_object().delete()return Response('')

3.3 总结

# 错误1 :一定要在用数据的时候再查
def get_queryset(self):return self.queryset.all() # 错误2:没有在类属性上配置 queryset--->源码中做了断言

4 5个视图扩展类(不是视图类–》先继承GenericAPIView)


# RetrieveModelMixin,  查询一条,写了一个方法  retrieve---》代码就是 跟咱们之前写获取单条get方法内容一样
# CreateModelMixin  新增一条写了一个方法  create---》代码就是 跟咱们之前写新增一条 post  方法内容一样
# DestroyModelMixin,删除一条写了一个方法  destroy---》代码就是 跟咱们之前写删除一条 delete  方法内容一样
# ListModelMixin,查询所有写了一个方法  list---》代码就是 跟咱们之前写删除一条 get  方法内容一样
# UpdateModelMixin  修改一个写了一个方法  update---》代码就是 跟咱们之前写删除一条put  方法内容一样# 为什么写5个,不写俩,因为后期不一定 5个接口都写class PublishView(GenericAPIView, ListModelMixin, CreateModelMixin):queryset = Publish.objects.all()  # 类只要加载,就会执行,查了所有数据,不能以它为准serializer_class = PublishSerializerdef get(self, request):return self.list(request)def post(self, request):# return  self.create(request) # 一定不要忘了returnreturn super().create(request)  # 一定不要忘了returnclass PublishDetailView(GenericAPIView, RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin):serializer_class = PublishSerializerqueryset = Publish.objects.all()def get(self, request, pk):return self.retrieve(request, pk)def put(self, request, pk):return self.update(request, pk)def delete(self, request, pk):return self.destroy(request, pk)

5 原生django,怎么写向响应头写入数据?

from django.http import HttpResponsedef custom_header_view(request):# 创建一个 HttpResponse 对象response = HttpResponse("This is a custom header example")# 向响应头添加自定义的 HTTP 头信息response['X-Custom-Header'] = 'Hello, World!'# 返回 HttpResponse 对象return response总结:首先创建了一个 HttpResponse 对象,并设置了响应的内容。然后,
通过 response['Header-Name'] 的方式向响应头添加自定义的响应头信息。
在这里,我们添加了一个名为 "X-Custom-Header" 的自定义头,其值为 "Hello, World!"。
最后,将 HttpResponse 对象返回,以便将其发送给客户端。
这样,客户端将会接收到包含自定义响应头信息的响应。

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

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

相关文章

python提取邮件的附件,以excel为例

配置邮箱、读取基本的邮件内容请参考:python读取并解析邮箱邮件,读取邮件主题、内容、时间 以excel为例: 获取邮件: email_value_config {imap_server: imap.exmail.qq.com, username: xxxxxxxx.com, password: xxxxx, }# 连接…

QTday5

一、客户端 二、服务器 三、配置图像处理环境 四、XMind思维导图

vscode新建vue3文件模板

输入快捷新建的名字 enter 确认后在文件中输入以下内容 {// Place your snippets for vue here. Each snippet is defined under a snippet name and has a prefix, body and// description. The prefix is what is used to trigger the snippet and the body will be expand…

webpack5 (四)

react-cli 中配置 开发环境 const path require(path) const EslintWebpackPlugin require(eslint-webpack-plugin) const HtmlWebpackPlugin require(html-webpack-plugin) const ReactRefreshWebpackPlugin require(pmmmwh/react-refresh-webpack-plugin); //封装处理样…

Django REST framework中的序列化Serializers

序列化器允许将诸如查询集和模型实例之类的复杂数据转换为原生 Python 数据类型,然后可以将它们轻松地呈现为 JSON,XML 或其他内容类型。序列化器还提供反序列化,在首次验证传入数据之后,可以将解析的数据转换回复杂类型。 简单来…

无需租用云服务器:使用Linux本地搭建web服务并实现内网穿透发布公网访问的详细教程

文章目录 前言1. 本地搭建web站点2. 测试局域网访问3. 公开本地web网站3.1 安装cpolar内网穿透3.2 创建http隧道,指向本地80端口3.3 配置后台服务 4. 配置固定二级子域名5. 测试使用固定二级子域名访问本地web站点 前言 在web项目中,部署的web站点需要被外部访问,则…

NoSQL:非关系型数据库分类

NoSQL,全称 Not Only SQL,意为不仅仅是 SQL,泛指非关系型数据库。NoSQL 是基于键值对的,而且不需要经过 SQL 层的解析,数据之间没有耦合性,性能非常高。 非关系型数据库又可细分如下: 键值存储…

前端自动化部署,Devops,CI/CD

DevOps 提到 Jenkins,想到的第一个概念就是 CI/CD 在这之前应该再了解一个概念。 DevOps Development 和 Operations 的组合,是一种方法论,并不特指某种技术或者工具。DevOps 是一种重视 Dev 开发人员和 Ops 运维人员之间沟通、协作的流程。…

前端包管理器:深入理解npm和yarn

引言 前端开发者们都知道,包管理器是我们日常开发中不可或缺的工具。在本文中,我们将深入探讨两个最常用的前端包管理器:npm (Node Package Manager) 和 Yarn。我们将通过一步步的操作,详细解释如何使用这两种工具,以…

Java on VS Code 8月更新|反编译器用户体验优化、新 Maven 项目工作流、代码高亮稳定性提升

作者:Nick Zhu 排版:Alan Wang 大家好,欢迎来到 Visual Studio Code for Java 的 8 月更新!在这篇博客中,我们将为您提供有关反编译器支持的更多改进。此外,我们将展示如何创建没有原型的 Maven 项目以及一…

TensorFlow是什么

TensorFlow是一个开源的深度学习框架,由Google开发,用于构建和训练神经网络。它提供了一种简单而灵活的方法来构建各种类型的机器学习模型,包括卷积神经网络、循环神经网络、深度神经网络等。TensorFlow使用图和张量的概念来描述计算流程。 …

【C语言】字符函数,字符串函数,内存函数

大家好!今天我们来学习C语言中的字符函数,字符串函数和内存函数。 目录 1. 字符函数 1.1 字符分类函数 1.2 字符转换函数 1.2.1 tolower(将大写字母转化为小写字母) 1.2.2 toupper(将小写字母转化为大写字母&…

SpringMVC之入门

目录 1.SpringMVC工作流程 2.SpringMVC核心组件 2.1 DispatcherServlet 2.2 HandlerMapping 2.3 Handler 2.4 HandlerAdapter 2.5 ViewResolver 2.6 View 3.SpringMVC的入门 3.1 添加相关依赖 3.2 创建Spring-mvc.xml 3.3 配置web.xml 3.4 效果演示 4.静态资源处…

ios 运行ipa包 日志查看方式

方法一: 使用ideviceinstaller工具 # 安装ipa命令 brew install ideviceinstaller ideviceinstaller -i xxx.ipa# 查看运行日志 idevicesyslog# idevicesyslog 查找命令 idevicesyslog | grep test -A 3 -B 2 # 输出关键字所在行后3行,前2行) idevic…

每日一道面试题之什么是上下文切换?

上下文切换是指在计算机操作系统中,当多个进程或线程同时运行时,系统需要将当前运行进程或线程的状态(包括程序计数器、寄存器值、内存映像等)保存起来,然后切换到另一个进程或线程继续执行的过程。上下文切换通常由操…

GeoServe Web管理界面远程访问GeoServe Web管理界面的最佳工具

文章目录 前言1.安装GeoServer2. windows 安装 cpolar3. 创建公网访问地址4. 公网访问Geo Servcer服务5. 固定公网HTTP地址 前言 GeoServer是OGC Web服务器规范的J2EE实现,利用GeoServer可以方便地发布地图数据,允许用户对要素数据进行更新、删除、插入…

5 | Java Spark WordCount打成Jar 包测试

步骤 1:准备 WordCount 代码 首先,确保 编写了 WordCount 代码,已经提供了正确的输入文件路径。 package com.bigdata;import org.apache.spark.SparkConf; import org.apache.spark.api.java.

golang操作数据库--gorm框架、redis

目录 1.数据库相关操作(1)非orm框架①引入②初始化③增删改查 (2) io版orm框架 (推荐用这个)①引入②初始化③增删改查④gorm gen的使用 (3) jinzhu版orm框架①引入②初始化③增删改查 2.redis(1)引入(2)初始化①普通初始化②v8初始化③get/set示例 1.数据库相关操作 (1)非orm…

AJAX学习笔记4解决乱码问题

AJAX学习笔记3练习_biubiubiu0706的博客-CSDN博客 在Tomcat10来说,AJAX GET或者POST接收响应都不存在乱码问题 对于Tomcat9来说 前端测试代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>测试A…

数据库-多表查询

概述&#xff1a; 介绍&#xff1a;多表查询&#xff1a;指从多张表中查询数据 笛卡儿积&#xff1a;笛卡儿积是指在数学中&#xff0c;两个集合&#xff08;A集合和B集合&#xff09;的所有组合情况&#xff08;在多表查询时&#xff0c;需要消除无效的笛卡儿积&#xff09; 分…