drf的请求与响应
# Request
首先, 提醒一点, REST framework 传入视图的request对象不再是Django默认的HttpRequest对象
而是 REST framework提供的扩展了HttpRequest类的Request类的对象!!
在前面有对Request类进行过分析!!详情请到 APIView.md中查看!
# 常用属性
Request类的实例化对象 (此处是request) 的常用属性
1> request.data
包含了对POST、PUT、PATCH请求方式解析后的数据..
type(request.data)的结果取决于前端编码的格式. urlencoded、formdata --> querydict ; json --> dict
这一点不是很重要,管它什么格式,request.data拿到后, 直接当作字典用就行啦 !!
2> request.query_params
与Django标准的request.GET相同,只是更换了更正确的名称而已
# 接口支持的编码
可以通过配置, 设置后端接口 支持/能够解析 的编码格式, 默认情况三种编码格式都支持!!
查找顺序/优先级: 视图类局部 -- 项目配置文件 -- drf的配置文件
因为有优先级存在,可以局部和全局配置结合着使用!!
# 局部配置
在视图类中写类属性 parser_classes
from rest_framework.views import APIView
from rest_framework.response import Response
"""
JSONParser -- 解析json格式 'application/json'
FormParser -- 解析from表单格式 'application/x-www-form-urlencoded'
MultiPartParser -- 解析文件格式 'multipart/form-data'
"""
from rest_framework.parsers import JSONParser, FormParser, MultiPartParser
class IndexView(APIView):
# 需求:想要后端视图类IndexView中post/put/patch请求类型的接口只 支持/接收 前端json编码的数据!!
parser_classes = [JSONParser, ]
def get(self, request):
return Response('get')
def post(self, request):
return Response(request.data)
# 不符合,返回前端的报错信息.
# {
# "detail": "Unsupported media type \"application/x-www-form-urlencoded\" in request."
# }
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 全局配置
在项目的settings.py中配置
REST_FRAMEWORK = {
# -- 全局解析的编码格式 全局生效,所有接口都支持
# 只不过是在自己项目的settings.py文件覆盖了drf内置配置文件settings.py里这部分的配置
'DEFAULT_PARSER_CLASSES': (
'rest_framework.parsers.JSONParser',
# 'rest_framework.parsers.FormParser',
# 'rest_framework.parsers.MultiPartParser'
)
}
2
3
4
5
6
7
8
9
# Response
drf的Response类的父类继承了Django的HttpResponse!!
以后我们接口返回的都是Response类的实例化对象!
# 构造方式
Response实例化对象的属性:
Response(data, status=None, template_name=None, headers=None, exception=False, content_type=None)
△ data:
要返回的数据,放到了Http响应的响应体中!
若传列表、字典,会序列化成json格式返回、若传字符串返回的也是字符串,不变.
△ status:
http响应的状态码,默认为200.
drf将所有的http状态码都定义成了常量,放到了rest_framework.status下 from rest_framework import status
△ headers:
用于往http响应头里写k-v的数据,是个字典
△ content_type:
响应的编码格式,此参数无需传递,REST framework会根据前端所需类型数据来自动设置该参数.
Ps: template_name、exception不用管.
原生的Django往响应头里写k-v数据,怎么做的?
def index(request):
res = HttpResponse('ok')
res['name'] = 'lqz' # -- 往响应头里写入name=lqz
return res
信息告知 - 1xx
成功 - 2xx
重定向 - 3xx
301 永久重定向
302 临时重定向
客户端错误 - 4xx
服务器错误 - 5xx
2
3
4
5
6
7
8
9
10
11
12
13
# 响应显示格式
响应数据回去后,是显示浏览器里drf提供的那个好看的页面,还是postman里的json格式,可以进行配置.
# 局部配置
在视图类中写类属性 renderer_classes
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 JSONOpenAPIRenderer, BrowsableAPIRenderer
class IndexView(APIView):
parser_classes = [JSONParser, ]
renderer_classes = [JSONOpenAPIRenderer, ]
def get(self, request):
return Response('get')
def post(self, request):
return Response(request.data)
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 全局配置
和配置前端数据的编码格式一样,在项目的settings.py中配置
REST_FRAMEWORK = {
# -- 前端数据编码格式/后端解析数据的格式
'DEFAULT_PARSER_CLASSES': (
'rest_framework.parsers.JSONParser',
# 'rest_framework.parsers.FormParser',
# 'rest_framework.parsers.MultiPartParser'
)
# -- 默认响应渲染类
# 若想浏览器访问也是json的话,把BrowsableAPIRenderer那行代码注释点即可.
'DEFAULT_RENDERER_CLASSES': (
'rest_framework.renderers.JSONRenderer', # -- json渲染器
'rest_framework.renderers.BrowsableAPIRenderer', # -- 浏览API渲染器
)
}
2
3
4
5
6
7
8
9
10
11
12
13
14