【问题标题】:Most RESTful way of storing data that is to be served as JSON?以 JSON 形式存储数据的最 RESTful 方式?
【发布时间】:2012-06-21 18:21:46
【问题描述】:
我有一个 Django 服务器,负责将 JSON 格式的文件提供给控制器机器。我的服务器从 POST 请求中获取数据,并在 GET 请求中提供 JSON 文件。我想知道在服务器上创建这个桥的最 RESTful 和最有效的方式是什么?
我正在考虑为每个 POST 请求创建一个 JSON 模型并将实例存储在我的数据库中,并将这些实例动态地打包到 JSON 文件中,并在 GET 请求中为它们提供服务。另一种方法是在 POST 请求上创建 JSON 文件,将它们保存在服务器上的文件夹中,并在 GET 请求上提供这些文件。
哪种方式更好,为什么?还是我没有看到更好的方法?
【问题讨论】:
标签:
django
json
post
get
request
【解决方案1】:
为什么要创建文件?您可以让 Django 视图返回 JSON 响应而不是 HTML 响应:
import json
# in your view:
data = {}
return HttpResponse(json.dumps(data), mimetype="application/json")
从可用数据动态构造 JSON 数据,如果 JSON 响应很大,则添加缓存(例如,memcached 或 Varnish)。
这将防止某些问题(如果 GET 请求完成但还没有 JSON 文件怎么办?)。这样您就可以根据您拥有的数据生成 JSON,或者返回带有错误消息的 JSON。
【讨论】:
-
对,经过大量研究,我发现 serialization 支持 Django 模型。我将尝试构建我的类(使用正确的外键)并实现 natural_key() 方法。一旦我尝试了,就会回来回答。
【解决方案2】:
我使用自然键和依赖项等查看json serialization,以控制被序列化的字段。我还尝试使用中间件wodofstuff 来允许更深层次的外键序列化。但是,我决定使用模板来呈现 JSON 响应。
一些陷阱是
- 我负责格式化 JSON(更容易出错,例如缺少分号)
- 我负责转义字符
- 渲染比内置序列化慢?
一些优点是
- 我可以控制序列化的内容(即使基础模型已更改)
- 我可以格式化 JSON 文件上的多对多或外键关系,但我喜欢
TLDL;就我而言,我需要的 JSON 文件的格式是非常自定义的。它在字典列表中有字典。有些字段是迭代的,所以我在模板中有 for 循环来呈现它们。但是,该格式要求将迭代对象中的某些字段封装在列表中,而不是字典。
这是我在考虑simplejson 时遇到的障碍。通过使用类似的东西
import simplejson as json
def encode_complex(obj):
if isinstance(obj, complex):
return [obj.real, obj.imag]
raise TypeError(repr(o) + " is not JSON serializable")
json.dumps(2 + 1j, default=encode_complex)
'[2.0, 1.0]'
我可以设法返回迭代数据;但是,我需要迭代中的迭代和自定义对象类型(列表或字典)来封装某些迭代。最后,(可能是缺乏知识或缺乏耐心)我决定只在模板中进行。
我觉得通过模板渲染它并不是最可扩展或“最智能”的方式,是否可以以更好的方式完成?请随时证明我是对还是错。