【问题标题】:django stream a dictionary multiple times w/o breaking JSONdjango 多次流式传输字典而不破坏 JSON
【发布时间】:2018-05-22 14:14:26
【问题描述】:

我想使用 Django 流式传输响应。为了做到这一点, 我有这样的看法:

def flights(request, query): req_obj = Flights.RequestObject(query) return StreamingHttpResponse(req_obj.make_response(), content_type="application/json")

为了生成流的数据,我有一个生成器函数“make_response”, 这是“Flights”类的一个方法,实例化为“req_obj”。

生成器函数在特定时刻产生一个纯 Python 字典。

def make_response(self):
   for _ in range(0,3):
      yield some_dict
      time.sleep(1)

这会导致以下行为:

  • 第一次yield后,json内容返回有效;
  • 在第二个(及后续)产生后,返回的 json 内容无效;

如果返回的字典是这样的

{"data": "some_data"}

, 在第二次 yield 之后,用户收到的响应是:

{"data": "some_data"}{"data": "some_data"}

,这不是有效的 json。

关于如何解决这个问题有什么建议吗?

【问题讨论】:

    标签: python json django stream


    【解决方案1】:

    你有没有尝试过类似的东西

    req_obj.update(req_obj.make_response())
    

    哪个会用你的方法新产生的值更新你的初始字典?

    【讨论】:

    • 您好,首先感谢您的帮助。很遗憾,我没听懂你的回答。
    • 我猜这个更新会发生在 streamingHttpResponse 的第一个参数中,不幸的是,这不起作用,因为 req_obj.make_response() 不是一个对象,而是一个生成器。 @奥马尔
    • 啊,是的,正确的@RafaelMarques,那么在生成器内部你做一个怎么样:yield self.update(some_dict) 我不确定你是如何从 Flight 对象构建字典的,但是因为您可以在 make_response 中访问它,您也许可以使用它来更新正在生成的字典
    • 这不是问题。问题是多次生成字典(相等或不同)会产生不是字典的东西。 @奥马尔
    • 正确,所以在您的问题中它返回了两个字典,因此更新会将值合并到一个字典中
    猜你喜欢
    • 2012-09-04
    • 1970-01-01
    • 1970-01-01
    • 2021-01-18
    • 2019-09-10
    • 1970-01-01
    • 2018-07-11
    • 2018-01-28
    相关资源
    最近更新 更多