drf---请求+响应+GenericAPIView类+字典setdefault方法补充

9.29内容整理和概述

今日内容概要

内容目录

  • drf之请求
  • drf之响应
  • drf之GenericAPIView类
  • drf之GenericAPIView类的示例
  • 战略补充

drf之请求

'--------Request类----------'
属性/方法:		# 常用
	1.data:返回解析之后的实体数据
		特性:
			1.包含解析之后的文件和非文件数据
			2.包含POST、PUT、PATCH请求方式解析后的数据		#  在原生djagno中put提交的数据在request.POST中是取不到的
			3.支持表单数据和json类型数据
	2.query_params:获取解析之后get请求的数据	# 和原生django的request.get功能相同,只是换了名字,更符合restful规范
	3.其他原生request类方法和属性

'--------请求编码----------'
默认drf能解析的请求编码:		# 在drf的settings.py文件中的DEFAULT_PARSER_CLASSES参数默认配置的
	1.urlencoded
	2.form-data
	3.json

DEFAULT_PARSER_CLASSES参数:
	1.rest_framework.parsers.JSONParser:可以解析json格式
	2.rest_framework.parsers.FormParser:可以解析urlencoded格式
	3.rest_framework.parsers.MultiPartParser:可以解析form-data格式

自定义请求编码方法:
	方法一:全局配置
		步骤:
            1.在自己的项目app的settings.py文件创建REST_FRAMEWORK属性		# REST_FRAMEWORK负责drf所有的配置
            2.在REST_FRAMEWORK导入DEFAULT_PARSER_CLASSES参数
            3.在DEFAULT_PARSER_CLASSES参数中编辑需要的请求编码
		例子:
			REST_FRAMEWORK = {
				'DEFAULT_PARSER_CLASSES': [
					'rest_framework.parsers.JSONParser',
					# 'rest_framework.parsers.FormParser',
					# 'rest_framework.parsers.MultiPartParser',
				],
			}

	方法二:局部配置
		步骤:
            1.直接在视图类中编辑parser_classes属性,该属性的数据类型为列表
            2.parser_classes属性中有JSONParser,FormParser,MultiPartParser	# 需要导包(from rest_framework.parsers import JSONParser,FormParser,MultiPartParser)
		例子:
			from rest_framework.parsers import JSONParser,FormParser,MultiPartParser
			class TestView(APIView):
				parser_classes = [JSONParser,FormParser,MultiPartParser]

实际项目运用:
	1.基本功能:JSONParser,FormParser
	2.文件上传:MultiPartParser

解析请求编码的顺序:视图类-->项目配置文件-->drf内置配置文件

drf之响应

'--------Response类----------'
参数:		
	1.data:将该参数对应的数据序列化成json格式字符串,返回给前端		# 序列化数据放在http响应的body里
	2.status:设置响应的状态码	# 默认为200
		drf响应状态码:drf将所有的http响应状态码都封装成了常量,导包使用		# 为了更符合restful规范
	3.headers:将该参数对应的字典类数据添加到响应头里
		原生django向响应头添加数据:		# 老刘讲得有点糊
			1.序列化数据
			2.将数据放在HttpResponse方法中并返回	# 例子:res=HttpResponse(d)
			3.返回数据为字典类型,添加响应头增加的数据	# 例子:res['rrr'] = 'yyyy'
			4.在将返回数据return出去	# 例子: return res
	4.template_name:指定自定义返回模板	# 了解
	5.content_type:指定Response的编码格式

'--------响应编码----------'
默认drf能解析的响应编码:		# 在drf的settings.py文件中的DEFAULT_RENDERER_CLASSES参数默认配置的
	1.json格式
	2.浏览器的格式

DEFAULT_RENDERER_CLASSES参数:
	1.rest_framework.renderers.JSONRenderer:可以解析json格式
	2.rest_framework.renderers.BrowsableAPIRenderer:可以解析浏览器的格式

自定义响应编码方法:
	方法一:全局配置
		步骤:
            1.在自己的项目app的settings.py文件创建REST_FRAMEWORK属性		
            2.在REST_FRAMEWORK导入DEFAULT_RENDERER_CLASSES参数
            3.在DEFAULT_RENDERER_CLASSES参数中编辑需要的响应编码
		例子:
			REST_FRAMEWORK = {
				'DEFAULT_RENDERER_CLASSES': [
					# 'rest_framework.renderers.JSONRenderer',
					'rest_framework.renderers.BrowsableAPIRenderer'
				],
			}

	方法二:局部配置
		步骤:
            1.直接在视图类中编辑renderer_classes属性,该属性的数据类型为列表
            2.renderer_classes属性中有JSONRenderer,BrowsableAPIRenderer	# 需要导包(from rest_framework.renderers import JSONRenderer,BrowsableAPIRenderer)
		例子:
			from rest_framework.renderers import JSONRenderer,BrowsableAPIRenderer
			class TestView(APIView):
				renderer_classes = [JSONRenderer,BrowsableAPIRenderer]

实际项目运用:响应编码一般不配置,用默认配置

drf之GenericAPIView类

作用:做中间封装类,后期还有封装度更高的类,此类为基石		# 自己理解

GenericAPIView继承类:APIView类(父类)

属性:
	1.queryset:定义当前要被序列化的数据体
	2.serializer_class:定义对应的序列化类
	3.lookup_field:规定了get_object()方法(查询单个对象)需要的条件字段		# 默认为pk
	4.filter_backends:过滤类
	5.pagination_class:分页类

方法:
	1.get_object:根据pk获取单个数据		# 例子:book = self.get_object()
	2.get_queryset:获取所有要序列化数据	# 例子:book_list = self.get_queryset()
	3.get_serializer:获取要使用的序列化类		# 例子:ser = self.get_serializer(instance=book_list, many=True)
	4.get_serializer_class:获取要使用的序列化类		# 需要多写一个括号,不推荐;例子:ser = self.get_serializer_class()(instance=book_list, many=True)

drf之GenericAPIView类的示例

from rest_framework.generics import GenericAPIView
class UserView(GenericAPIView):
    queryset = User.objects.all()
    serializer_class = UserSerializer

    def get(self, request):
        book_list = self.get_queryset()
        ser = self.get_serializer(instance=book_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({'code': 100, 'msg': "新增成功"}, status=201)
        else:
            return Response({'code': 101, 'msg': ser.errors})


class UserDetailView(GenericAPIView):
    queryset = User.objects.all()
    serializer_class = UserSerializer
    def get(self, request, pk):
        book = self.get_object()
        ser = self.get_serializer(instance=book)
        return Response(ser.data)

    def put(self, request, pk):
        book = self.get_object()
        ser = self.get_serializer(instance=book, data=request.data)
        if ser.is_valid():
            ser.save()
            return Response({'code': 100, 'msg': "修改成功"}, status=201)
        else:
            return Response({'code': 101, 'msg': ser.errors})

    def delete(self, request, pk):
        self.get_queryset().filter(pk=pk).delete()
        return Response('')

战略补充(字典setdefault方法)

字典setdefault方法:
	例子:res = dict.setdefault("age",18)
	功能:
		1.当字典中setdefault携带的key值存在时,返回对应的value值给接收变量
		2.当字典中setdefault携带的key值不存在时,返回setdefault携带的value值给接收变量
posted @ 2023-04-18 23:54  维生素Z  阅读(7)  评论(0)    收藏  举报