【问题标题】:How do I return a List from Tornado?如何从 Tornado 返回列表?
【发布时间】:2014-02-11 01:09:38
【问题描述】:

我正在尝试让龙卷风返回一个列表。

@tornado.gen.coroutine
@tornado.web.asynchronous
def get(self, param):

    ...
    someList = [bla,bla,bla]

    self.finish(someList)

但无论何时我都会得到

HTTPRequest(protocol='http', host='tornado', method='GET', uri='/orders/submitted', version='HTTP/1.0', remote_ip='127.0.0.1', headers={'Accept-Language': 'en-US,en;q=0.8', 'Accept-Encoding': 'gzip,deflate,sdch', 'Host': 'tornado', 'Accept': 'application/json, text/plain, */*', 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.107 Safari/537.36', 'Connection': 'close', 'Referer': 'admin/', 'Pragma': 'no-cache', 'Cache-Control': 'no-cache', 'Cookie': 'login="dHJ1ZQ==|1392074972|f4942e30293413717b380d1f362dd549548c404d"'})
Traceback (most recent call last):
  File "/Users/ruahman/swipe-tech-apps/rpm-tornado/env/lib/python2.7/site-packages/tornado/web.py", line 1221, in _when_complete
    if result.result() is not None:
  File "/Users/ruahman/swipe-tech-apps/rpm-tornado/env/lib/python2.7/site-packages/tornado/concurrent.py", line 129, in result
    raise_exc_info(self.__exc_info)
  File "/Users/ruahman/swipe-tech-apps/rpm-tornado/env/lib/python2.7/site-packages/tornado/stack_context.py", line 302, in wrapped
    ret = fn(*args, **kwargs)
  File "/Users/ruahman/swipe-tech-apps/rpm-tornado/env/lib/python2.7/site-packages/tornado/gen.py", line 574, in inner
    self.set_result(key, result)
  File "/Users/ruahman/swipe-tech-apps/rpm-tornado/env/lib/python2.7/site-packages/tornado/gen.py", line 500, in set_result
    self.run()
  File "/Users/ruahman/swipe-tech-apps/rpm-tornado/env/lib/python2.7/site-packages/tornado/gen.py", line 531, in run
    yielded = self.gen.send(next)
  File "/Users/ruahman/swipe-tech-apps/rpm-tornado/fabfile/server/request_handlers/orders.py", line 26, in get
    self.finish((u"hi",))
  File "/Users/ruahman/swipe-tech-apps/rpm-tornado/env/lib/python2.7/site-packages/tornado/web.py", line 810, in finish
    self.write(chunk)
  File "/Users/ruahman/swipe-tech-apps/rpm-tornado/env/lib/python2.7/site-packages/tornado/web.py", line 610, in write
    chunk = utf8(chunk)
  File "/Users/ruahman/swipe-tech-apps/rpm-tornado/env/lib/python2.7/site-packages/tornado/escape.py", line 203, in utf8
    "Expected bytes, unicode, or None; got %r" % type(value)
TypeError: Expected bytes, unicode, or None; got <type 'tuple'>
ERROR:tornado.access:500 GET /orders/submitted (127.0.0.1) 8424.93ms

当我返回字典时,我没有这个问题。它只发生在我返回数组时。 是的,我可以将列表嵌入到对象中,但我更喜欢结果是数组。

【问题讨论】:

    标签: json list tornado


    【解决方案1】:

    由于复杂的原因,使用数组作为 Web 上 JSON 对象的顶层结构存在安全风险。因此,Tornado 不会自动将列表转换为 JSON,只有字典。我建议您将列表嵌入到字典中:

    self.finish({'someList': someList})
    

    如果你坚持直接返回列表,你可以自己进行 JSON 编码:

    self.finish(json.dumps(someList))
    

    这里解释了与在 Web API 中使用顶级 JSON 数组相关的安全漏洞:

    【讨论】:

    • 还有什么我可以为您回答的,或者您会接受这个作为答案吗?
    • @a-jesse-jiryu-davis 你提到返回数组是一种安全风险,我试图阅读它,但找不到任何可信的东西。是否可以分享一些我可以阅读的好的参考资料。
    • 我已经更新了我的答案,并提供了一个指向该漏洞的流行解释之一的链接。
    • 谢谢,非常感谢:)
    • @A.JesseJiryuDavis,一个简单的问题:当您在通过调用self.finish(json_encoded_data) 返回数据之前自己对数据进行 JSON 编码时,您是否需要设置适当的响应标头,或者这由龙卷风(self.finish(some_dict) 也是如此)?
    猜你喜欢
    • 2012-09-05
    • 2017-02-19
    • 2013-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-06
    • 1970-01-01
    相关资源
    最近更新 更多