内容协商

内容协商是基于客户端或服务器偏好选择多种可能的表示之一以返回客户端的过程。

REST framework 根据可用的渲染器,每个渲染器的优先级以及客户端的 header,使用简单的内容协商风格来确定应将哪些媒体类型返回给客户端。所使用的风格部分由客户端驱动,部分由服务器驱动。

  1. 更具体的媒体类型优先于较不特定的媒体类型。

例如,给出以下 Accept header:

  • application/json; indent=4
  • application/json, application/yamltext/html

如果所请求的视图仅用 和 HTML 的渲染器配置,则 REST framework 将选择 renderer_classes 列表或 DEFAULT_RENDERER_CLASSES 设置中首先列出的渲染器。


注意: 确定偏好时,REST framework 不会考虑 “q” 值。使用 “q” 值会对缓存产生负面影响,作者认为这是对内容协商的一种不必要和过于复杂的方法。


自定义内容协商

你不太可能希望为 REST framework 提供自定义内容协商方案,但如果需要,你可以这样做。要实现自定义内容协商方案,请覆盖 BaseContentNegotiation

方法应从可用解析器列表中返回一个解析器实例,如果没有任何解析器可以处理传入请求,则返回 None

select_renderer() 方法应该返回(渲染器实例,媒体类型)的二元组,或引发 NotAcceptable 异常。

以下是自定义内容协商类,它在选择适当的解析器或渲染器时会忽略客户端请求。

你还可以使用 API​​View 基于类的视图设置用于单个视图或视图集的内容协商。