参考文档
http://www.iamnancy.top/djangorestframework/Responses/
https://q1mi.github.io/Django-REST-framework-documentation/api-guide/requests_zh/
https://www.django-rest-framework.org/api-guide/responses/
1、Requests
1、Request类
Request类扩展了标准的HttpRequest
request.META 和 request.session 字典可以正常使用
由于实现原因,Request 类不会从 HttpRequest 类继承,而是使用组合扩展类
2、request.data
request.data
返回请求主体的解析内容
比request.POST 和 request.FILES更加强大
优点如下:
它包括所有解析的内容, 包括 文件或非文件 输入。
它支持解析除POST之外的HTTP方法的内容,这意味着你可以访问PUT和PATCH请求的内容。
它支持REST framework灵活的请求解析,而不仅仅支持表单数据。
例如,你可以以与处理传入表单数据相同的方式处理传入的JSON数据。
3、request.query_params
是request.GET的一个更准确的同义词。
任何HTTP方法类型可能包括查询参数,而不仅仅是GET请求。
4、parsers 解析器
APIView类或@api_view装饰器将根据view中设置的parser_classes集合或基于DEFAULT_PARSER_CLASSES设置,
确保此属性自动设置为Parser实例列表。
Note
1、错误格式: request.data可能会引发ParseError, APIView类或@api_view装饰器将捕获错误并返回400 Bad Request响应 2、无法解析的类型的请求 引发 UnsupportedMediaType 异常, 该异常并返回 415 Unsupported Media Type 响应
5、认证器authentication
1. request.user
request.user 通常会返回django.contrib.auth.models.User实例
未经身份验证的,默认值是django.contrib.auth.models.AnonymousUser实例
2. request.auth
request.auth 返回任何附加的认证上下文
未经认证的,返回None
3. authenticators
APIView 类或 @api_view 装饰器将根据视图上设置的 authentication_classes
DEFAULT_AUTHENTICATORS 设置确保将此属性自动设置为 Authentication 实例列表。
调用 .user 或 .auth 属性时可能会引发 WrappedAttributeError 异常
认证器 (authenticator) 作为标准 AttributeError
6、浏览器增强
1. request.method
request.method返回大写的请求方法 PUT,PATCH 和 DELETE 表单
2. request.content_type
返回HTTP请求正文的媒体类型的字符串对象
如果需要定义 确实需要访问请求的内容类型,则应该优先使用 .content_type 属性,而不是使用 request.META.get('HTTP_CONTENT_TYPE')
3. request.stream
返回一个代表请求主体内容的流。
2、Response响应
Response 类是 Django中 SimpleTemplateResponse 类的一个子类
除非由于某种原因你要对 REST framework 做大量的自定义,
否则你应该始终对返回对象的views使用 APIView 类或者 @api_view 函数。
这样做可以确保视图在返回之前能够执行 content negotiation 并且为响应选择适当的渲染器。
1、创建response
return Response(data, status=None, template_name=None, headers=None, content_type=None) # 参数: data :响应的序列化数据。 status :响应的状态代码。默认为200。另请参阅状态代码。 template_name :选择 HTMLRenderer 时使用的模板名称。 headers :响应中使用的 HTTP headers 的字典。 content_type :响应的内容类型。通常情况下,渲染器会根据内容协商的结果自动设置,但有些情况下需要明确指定内容类型。
1、restframework
Response 类使用的渲染器不能处理复杂的数据类型,
所以需要在创建 Response 对象之前将数据序列化为基本数据类型。
您可以使用 REST framework 的 Serializer 类来执行数据序列化,或者使用您自己的自定义序列化。
2、django
与常规 HttpResponse 对象不同,您不会使用渲染的内容实例化 Response 对象。相反,您传递的是未渲染的数据,可能由任何 Python 基元组成。
例如 Django 模型实例,
2、属性 Attributes
res = Response()
#res.data Request 对象的未渲染内容。 #res.status_code HTTP 响应的数字状态码 #res.content 响应的渲染内容。在访问 .content 之前,必须先调用 .render() 方法。 #res.template_name 只有当 HTMLRenderer 或其他自定义模板渲染器是响应的渲染器时才需要。 比如:之前的代码高亮显示 #res.accepted_renderer 用于渲染响应的渲染器实例。 从视图返回响应之前由 APIView 或 @api_view 自动设置 #res.accepted_media_type 由 content negotiation 阶段选择的媒体类型。 自动通过 APIView 或者 @api_view 在view返回response之前设置 #res.renderer_context 将传递给渲染器的 .render() 方法的附加的上下文信息的字典
3、标准 HttpResponse 属性
1. 设置headers
Response 类扩展了 SimpleTemplateResponse,并且响应中也提供了所有常用的属性和方法
```python
response = Response()
response['Cache-Control'] = 'no-cache'
```
2. .render()
调用此方法将响应的序列化数据渲染为最终响应内容
调用 .render() 时,响应内容将设置为在 accepted_renderer 实例上调用
.render(data,accepted_media_type,renderer_context) 方法的结果。
您通常不需要自己调用 .render(),因为它是由 Django 的标准响应循环处理的。
3、总结
1、Request和Response
请求 | 响应 | |
restframe | Request+序列化 | 序列化+Response |
django | HttpRequest | HttpResponse |
2、request.data与request.query_params
request.data | POST请求 |
request.query_params | 任何http请求,都有要查询,不仅仅是get |
3、各种解析器,渲染器,xx器
APIView
类或@api_view
装饰器,内部自定制的