DRF(五):Request和Response
一 请求与响应
1.1 Request
REST framework 传入视图的request对象不再是Django默认的HttpRequest对象,而是REST framework提供的扩展了HttpRequest类的Request类的对象。
REST framework 提供了Parser解析器,在接收到请求后会自动根据Content-Type指明的请求数据类型(如JSON、表单等)将请求数据进行parse解析,解析为类字典[QueryDict]对象保存到Request对象中。
Request对象的数据是自动根据前端发送数据的格式进行解析之后的结果。
无论前端发送的哪种格式的数据,我们都可以以统一的方式读取数据。
1.1.1常用属性
1).data
request.data
返回解析之后的请求体数据。类似于Django中标准的request.POST
和 request.FILES
属性,但提供如下特性:
- 包含了解析之后的文件和非文件数据
- 包含了对POST、PUT、PATCH请求方式解析后的数据
- 利用了REST framework的parsers解析器,不仅支持表单类型数据,也支持JSON数据
2).query_params
request.query_params
与Django标准的request.GET
相同,只是更换了更正确的名称而已。
3).user
request.user
通常返回一个 django.contrib.auth.models.User
实例, 尽管该行为取决于所使用的的认证策略。
如果请求未认证则 request.user
的默认值为 django.contrib.auth.models.AnonymousUser
的一个实例。匿名用户
1.1.2 DRF的Request对象分析
1 django 原生的Request:django.core.handlers.wsgi.WSGIRequest
2 drf的Request:rest_framework.request.Request
3 drf的request对象内有原生的request,request._request:原生的Request
4 在视图类中使用 request.method 拿到的就是请求方式,
正常拿,应该request._request.method
5 如何实现这种操作?
-对象.属性会触发 类的__getattr__方法
6 drf的Request类重写了__getattr__
def __getattr__(self, attr):
try:
# 去原生的request反射属性
return getattr(self._request, attr)
except AttributeError:
return self.__getattribute__(attr)
7 虽然视图类中request对象变成了drf的request,但是用起来,跟原来的一样,只不过它多了一些属性
-request.data #post请求提交的数据,不论什么格式,都在它中
-requst.query_params# get请求提交的数据(查询参数)
8 重点记住:
-drf的request对象用起来跟原来一样(重写了__getattr__)
-request.data #post请求提交的数据,不论什么格式,都在它中
-requst.query_params# get请求提交的数据(查询参数)
1.2 Response
|
|
REST framework提供了一个响应类Response
,使用该类构造响应对象时,响应的具体数据内容会被转换(render渲染)成符合前端需求的类型。
REST framework提供了Renderer
渲染器,用来根据请求头中的Accept
(接收数据类型声明)来自动转换响应数据到对应格式。如果前端请求中未进行Accept声明,则会采用默认方式处理响应数据,我们可以通过配置来修改默认响应格式。
可以在rest_framework.settings查找所有的drf默认配置项
|
|
1.2.1 构造方式
|
|
data
数据不要是render处理之后的数据,只需传递python的内建类型数据即可,REST framework会使用renderer
渲染器处理data
。
data
不能是复杂结构的数据,如Django的模型类对象,对于这样的数据我们可以使用Serializer
序列化器序列化处理后(转为了Python字典类型)再传递给data
参数。
参数说明:
-
data
: 为响应准备的序列化处理后的数据; -
status
: 状态码,默认200; -
template_name
: 模板名称,如果使用HTMLRenderer
时需指明; -
headers
: 用于存放响应头信息的字典; -
content_type
: 响应数据的Content-Type,通常此参数无需传递,REST framework会根据前端所需类型数据来设置该参数。
1.2.2 常用属性
1).data
传给response对象的序列化后,但尚未render处理的数据
2).status_code
状态码的数字
3).content
经过render处理后的响应数据
1.2.3 状态码
为了方便设置状态码,REST framewrok在rest_framework.status
模块中提供了常用状态码常量。
1.2.4 自定义封装Reponse类
class APIResponse(Response):
def __init__(self, code=100, msg=None, data=None, status=None,
template_name=None, headers=None,
exception=False, content_type=None, **kwargs):
dic = {'status': code, 'msg': msg}
if data:
dic['data'] = data
if kwargs:
dic.update(kwargs)
super().__init__(data=dic, status=status,
template_name=template_name, headers=headers,
exception=exception, content_type=content_type)
### 使用,在视图类中
return APIResponse(msg='成功了',data={'name': 'lqz', 'age': 19},next=9)
推荐阅读
-
Scrapy 中 Request 对象和 Response 对象的各参数及属性介绍
-
黑马程序员IDEA版JAVA基础班\JavaWeb部分视频\2-10Request和Response\第5节 request登录案例
-
javaWeb核心技术第七篇之HTTP、Tomcat、Servlet、Request和Response
-
打印HTTP request body和response body实现日志跟踪
-
drf--请求与响应:Request与Response常用属性、状态码
-
DRF (Django REST framework) 中的Request 与 Response
-
DRF(五):Request和Response
-
Request对象 和 Response对象如何使用
-
Request和Response详解
-
python入门之scrapy框架中Request对象和Response对象的介绍