内容类型和表示

not*_*oop 5 django url content-type url-routing

在django中支持资源(例如博客,用户)的多重表示(例如html,json,xml)的常见惯例是什么?

首先,我不知道应该如何格式化我的网址.例如,您使用这些URL中的任何一个来请求xml格式

  • /<resource>.<format>,例如 /blogs/123.xml
  • /<format>/<resource>,例如 /xml/blogs/123
  • /<resource>?format=<format>,例如 /blogs/123?format=xml

我应该只依赖Content-Type传递的参数吗?那么有多个移动表示(例如iphone,mobile,palm)和完整的浏览器表示呢?

观点怎么样?在没有大量if语句或重复代码的情况下选择正确模板的惯例是什么.

yfe*_*lum 7

如果要解决这个问题,我可能会做的是:

  • 您的视图会查找Accept标题(我认为这就是您所说的内容),并根据Accept标题决定要发回的内容类型.
  • 您有一个中间件,它在Request-URI中查找扩展名,将其删除,并将相关的内容类型添加到请求Accept标头中.

对于此解决方案,URL中的内容类型将始终表示为关联的文件扩展名,既不是查询字符串的一部分,也不是资源名称的一部分.但是除了浏览器生成的请求之外,内容类型应该通过Accept标头进入.

所以请求来自:

GET /blogs/123.xml HTTP/1.1
Host: example.com
Run Code Online (Sandbox Code Playgroud)

中间件将其转换为:

GET /blogs/123 HTTP/1.1
Host: example.com
Accept: application/xml
Run Code Online (Sandbox Code Playgroud)

您的视图会查看application/xml并返回包含XML内容的响应.