drf请求响应简介
请求Request
在DjangoViews中,每定义一个视图,都会传入一个默认的HttpRequest对象,这个HttpRequest对象由Django为我们创建。
REST Framework传入视图的request对象就不再是Django默认的HttpRequest对象,而是REST framework提供的扩展了HttpRequest类的Request类的对象。
REST framework 提供了Parser解析器,在接收到请求后会自动根据Content-Type指明的请求数据类型(如JSON、表单等)将请求数据进行parse解析,解析为类字典对象保存到Request对象中。
Request对象的数据是自动根据前端发送数据的格式进行解析之后的结果。无论前端发送的哪种格式的数据,我们都可以以统一的方式进行读取。
常用属性
Data
Request.data返回解析之后的请求体数据。类似于Django中标准的request.POST和request.FILES属性,但提供的如下特性:
包含了解析之后的文件和非文件数据
包含了POST、PUT、PATCH请求方式解析后的数据
利用了REST framework的parsers解析器,不仅支持表单类型数据,也支持JSON数据
query_params(查询字符串)
request.query_params与标准的request.GET相同,只是更换了更准确的名称而已。
响应Response
此处的响应就不再是django中的HttpResponse对象了,而是由REST
framework提供的一个响应类Response,使用该类构造响应对象时,响应的具体数据内容会被转换(渲染)成符合前端需求的类型(JSON,XML)。
RESTframework提供了Renderer渲染器,用来根据请求头中的Accept(接收数据类型声明)来自动转换相应数据到对应格式。如果前端请求中未进行Accept声明,则会采用默认方式处理相应数据,我们可以通过配置来修改默认响应格式。
构造方式
from rest_framework.response import Response Response(data, status=None, template_name=None, headers=None, content_type=None)
注意:
data数据不要是render处理之后的数据,只需传递python的内建类型数据即可,REST framework会使用renderer渲染器来处理data
Data不能是复杂结构的数据,例如Django的模型类对象,对于模型类对象的话,可以使用序列化器来进行序列化处理之后再传递给data参数。
参数说明
Data:为响应准备的序列化处理后的数据;
Status:状态码,默认为200;
Template_name:模板名称,如果使用HTMLRenderer时需要指明;
Headers:用于存放响应头信息的字典;
Content_type:响应数据的Content_type,通常此参数无需传递,REST framework会根据前端所需类型数据类设置该参数。
Response常用属性
- Data传给response对象的序列化器后,但还没有经过render处理的数据
- status_code
状态码
- Content
经过render处理后的响应数据
基类
REST Framework为我们提供了视图的基类,继承于django的View父类。其位于rest_framework.views中
APIView的使用
APIView类
位置:rest_framework.views.APIView
APIView是REST Framework提供的所有视图的基类,继承于Django的View父类。
APIView与View的不同之处:
传入到视图方法中的是REST framework的Request对象,而不是Django的HttpRequeset对象;
视图方法可以返回REST framework的Response对象,视图会为响应数据设置(render)符合前端要求的格式;
任何APIException异常都会被捕获到,并且处理成合适的响应信息;
在进行dispatch()分发前,会对请求进行身份认证、权限检查、流量控制。
使用案例
案例一:查看drf的结构
先创建一个子应用
- 在自应用的views.py文件中导入APIView并写上函数
导入模块:
from rest_framework.views import APIView
from rest_framework.response import Response
class HusbandAPIView(APIView): def get(self, request): data = request.data print(data) print(type(data)) return Response({'message':'请求处理成功'})
配置路由
运行项目,在网页中可看到drf的结构
案例二:使用post请求获取表单和非表单数据
- 写上post方法
使用Postman发送表单请求
接收非表单的数据
案例三:使用get方法获取查询字符串