参考文档

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

、错误格式:
request.data可能会引发ParseError,
APIView类或@api_view装饰器将捕获错误并返回400 Bad Request响应 、无法解析的类型的请求
引发 UnsupportedMediaType 异常,
该异常并返回 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装饰器,内部自定制的

最新文章

  1. 移动端(h5)开发笔记
  2. SharePoint 2010 GridView/SPGridView完全应用系统样式
  3. PL/SQL使用技巧
  4. NODE.JS学习的常见误区及四大名著
  5. iOS 自动布局详细介绍
  6. vijos 1028 LIS *
  7. 简直喝血!H.265要被专利费活活玩死
  8. eclipse中的项目导出成Androidstudio的识别的项目,so文件打包不进去
  9. Ps 美白磨皮【1】
  10. 【HDOJ】2577 How to Type
  11. Android系统APN配置具体解释
  12. ios控件 UIControl
  13. Android源码博文集锦2
  14. PHP 支持加解密的函数
  15. python 文本比对
  16. pytorch学习:准备自己的图片数据
  17. 【转】Android中保持Service的存活
  18. hello2 源码分析
  19. #5【BZOJ4275】[ONTAK2015]Badania
  20. java内部类(三)

热门文章

  1. tp5 关键字模糊查询 日期查询 小于大于某范围等查询的优点
  2. Eclipse控制台不限日志行数
  3. Web基础和servlet基础
  4. Apache Shiro初认识
  5. go语言实现单链表
  6. AtomicIntegerFieldUpdater和AtomicInteger
  7. ip地址 与子网掩码 的计算
  8. 使用SAP Cloud Platform Leonardo机器学习的测试控制台
  9. Android笔记(二十六) Android中的广播——BroadcastReceiver
  10. Python面向对象Day1