drf请求和响应、GenericAPIView封装、5个视图扩展类

海棠未雨,梨花先雪,一半春休 / 2023-09-04 / 原文

一、drf 之请求

1、drf 之请求Request类

视图类继承APIView后多了
-0 去除了csrf认证
-1 新的request
   -request.data
   -request.query_params
   -request.其他跟之前一样
   -request._request  是老的
-2 三大认证
-3 全局异常

2、控制前端请求的编码格式

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

局部限制

写一个类属性 parser_classes = [JSONParser或者FormParser、MultiPartParser] 

class BookView(APIView):
    # 类属性
    parser_classes = [JSONParser]

    def get(self, request):
        res = Response(data={123}, status=500, headers={'xxx': 'yyy'})
        print(res.data)
        return res

    def post(self, request):
        print(self.parser_classes)
        print(request.data)
        return Response('新增')

效果:

全局限制

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',
    ],
}

补充:

全局使用后,局部再限制---》只需要在视图类上加即可

全局如果用了,局部这样配,优先用局部的,也就是这个类管理的接口,只能接收form-data格式 parser_classes = [MultiPartParser]

二、drf之响应

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  了解,可以定制自己返回的页面样子

###补充:后面会用---》通过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、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、基于原生的django,向响应头写入数据

from django.http import HttpResponse

def custom_header_view(request):
    # 创建一个HttpResponse对象
    response = HttpResponse("Hello, World!")

    # 向响应头添加自定义信息
    response['X-Custom-Header'] = 'this is a test'

    return response

 

 

 

三、