官方原文链接
本系列文章 github 地址
转载请注明出处

内容协商

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

确定接受的渲染器

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

  1. 更具体的媒体类型优先于较不特定的媒体类型。
  2. 如果多种媒体类型具有相同的特性,则优先根据为给定视图配置的渲染器排序。

例如,给出以下 Accept header:

application/json; indent=4, application/json, application/yaml, text/html, */*
复制代码

每种给定媒体类型的优先级为:

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

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


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


自定义内容协商

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

REST framework 的内容协商类处理选择适当的请求解析器和适当的响应渲染器,因此你应该实现 .select_parser(request, parsers).select_renderer(request, renderers, format_suffix) 方法。

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

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

举个栗子

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

from rest_framework.negotiation import BaseContentNegotiationclass IgnoreClientContentNegotiation(BaseContentNegotiation):def select_parser(self, request, parsers):"""Select the first parser in the `.parser_classes` list."""return parsers[0]def select_renderer(self, request, renderers, format_suffix):"""Select the first renderer in the `.renderer_classes` list."""return (renderers[0], renderers[0].media_type)
复制代码

设置内容协商

默认内容协商类可以使用 DEFAULT_CONTENT_NEGOTIATION_CLASS setting 全局设置。例如,以下设置将使用我们的示例 IgnoreClientContentNegotiation 类。

REST_FRAMEWORK = {'DEFAULT_CONTENT_NEGOTIATION_CLASS': 'myapp.negotiation.IgnoreClientContentNegotiation',
}
复制代码

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

from myapp.negotiation import IgnoreClientContentNegotiation
from rest_framework.response import Response
from rest_framework.views import APIViewclass NoNegotiationView(APIView):"""An example view that does not perform content negotiation."""content_negotiation_class = IgnoreClientContentNegotiationdef get(self, request, format=None):return Response({'accepted media type': request.accepted_renderer.media_type})
复制代码

Django REST framework API 指南(19):内容协商相关推荐

  1. Django REST framework API 指南(2):响应

    Django REST framework API 指南(1):请求 Django REST framework API 指南(2):响应 Django REST framework API 指南(3 ...

  2. Django REST framework API 指南(12):验证器

    官方原文链接 本系列文章 github 地址 转载请注明出处 验证器 大多数情况下,您在 REST framework 中处理验证时,只需依赖默认的字段验证,或者在序列化类或字段类上编写明确的验证方法 ...

  3. Django REST framework API 指南(11):序列化·关系

    官方原文链接 本系列文章 github 地址 转载请注明出处 Serializer 关系 关系字段用于表示模型关系. 它们可以应用于 ForeignKey,ManyToManyField 和 OneT ...

  4. Django REST framework API 指南(25):状态码

    官方原文链接 本系列文章 github 地址 转载请注明出处 状态码 不建议在你的响应中使用裸露(直接使用数字)的状态码. REST framework 包含一组命名常量,你可以使用它们使代码更加清晰 ...

  5. Django REST framework API开发

    REST 介绍 RESTful API 设计 实现API的两种方式 FBV 视图函数 urlpatterns = [url(r'^user/$', views.user),url(r'^user/ad ...

  6. Django REST Framework API Guide 01

    之前按照REST Framework官方文档提供的简介写了一系列的简单的介绍博客,说白了就是翻译了一下简介,而且翻译的很烂.到真正的生产时,就会发现很鸡肋,连熟悉大概知道rest framework都 ...

  7. Django REST Framework API Guide 02

    本节大纲 1.Generic Views 2.ViewSets  1.Generic Views CBV的主要的一个优点就是极大的允许了对于代码的从用.自然,rest framework取其优势,提供 ...

  8. Django REST Framework API Guide 07

    本节大纲 1.Permissions 2.Throttling Permissions 权限是用来授权或者拒绝用户访问API的不同部分的不同的类的.基础的权限划分 1.IsAuthenticated ...

  9. vue 多个api请求_Vue+Django REST framework实战3.RESTful API和VUE目录结构

    内容提要: RESTful API和VUE基础概念. <Python前后端分离开发Vue+Django REST framework实战>作者bobby --学习来源 第四章 RESTfu ...

  10. django html5 关系,Django REST FrameWork中文教程5:关系和超链接API

    目前我们的API中的关系是用主键表示的.我们将通过使用超链接来提高我们API的内部联系. 为我们的API创建一个根路径 现在我们有'snippets'和'users'的路径,但是我们的API没有一个入 ...

最新文章

  1. EUV光刻机全球出货量达57台
  2. 初入react-redux (基于webpack babel的react应用框架)
  3. 练习友元函数,有元类,快排和全排列问题
  4. Puppet 实验三 安装和配置
  5. C# 计时函数精度测试
  6. SHA-1退休:数千万用户通向加密网站之路被阻
  7. windows 10 下利用WSL的Linux环境实现vscode C/C++环境的配置
  8. MySql数据库表类型MYISAM与InnoDB的区别
  9. (转)python的range()函数用法
  10. 腾讯单子非:知识图谱在NLU与推荐中,是如何发挥作用的?该如何构建?
  11. 错误解决办法:gcc编译时提示对‘sqrt’未定义的引用
  12. 蓝桥杯真题:k倍区间
  13. 赵雯北京大学计算机动画系,北京大学艺术类、设计类考研辅导课程
  14. 批量建模:有序多分类Logistic回归(Ordinal Logistic Regression)
  15. 是java运行时环境的缩写,java运行环境的英文缩写
  16. 端电压,相电压,线电压区别
  17. iPad菜单日渐走热美国
  18. 【机器学习】初学理论知识
  19. 使用logisim设计简易CPU
  20. 模拟买一台计算机及装机心得,装机模拟器显卡及处理器超频影响因素分析 超频体验心得_游侠网...

热门文章

  1. java是什么_Java是什么?Java的特点有哪些?
  2. ai/ml_本月有关AI / ML的令人印象深刻的中等文章
  3. php cms 那个安全,PHPCMS系统安全设置步骤
  4. jqgrid本地数据例子_FMS财务系统:日常数据核对与处理
  5. head 标签里有什么?
  6. React中的三种类型组件介绍
  7. js弹出框、遮罩层、可拖动学习
  8. U盘安装Debian 6 amd64版本
  9. 分享3个整站打包程序
  10. 【java与智能设备】01_2Android简介与环境搭建——开发环境