【问题标题】: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 响应很大,则添加缓存(例如,memcachedVarnish)。

    这将防止某些问题(如果 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]'
    

    我可以设法返回迭代数据;但是,我需要迭代中的迭代和自定义对象类型(列表或字典)来封装某些迭代。最后,(可能是缺乏知识或缺乏耐心)我决定只在模板中进行。

    我觉得通过模板渲染它并不是最可扩展或“最智能”的方式,是否可以以更好的方式完成?请随时证明我是对还是错。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-08
      • 2021-08-07
      • 1970-01-01
      • 1970-01-01
      • 2011-12-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多