Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Json 如何从Tornado返回列表?_Json_List_Tornado - Fatal编程技术网

Json 如何从Tornado返回列表?

Json 如何从Tornado返回列表?,json,list,tornado,Json,List,Tornado,我正试图让tornado返回一份清单 @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',

我正试图让tornado返回一份清单

@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
HTTPRequest(protocol='http',host='tornado',method='GET',uri='/orders/submitted',version='http/1.0',remote\u 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.0AppleWebKit/537.36(KHTML,类似Gecko)Chrome/32.0.1700.107 Safari/537.36,“连接”为“关闭”,“引用者”为“管理/”,“Pragma”为“无缓存”,“缓存控制”:“无缓存”,“Cookie”:“login=”1392074972 | F492E3030413717B380D1F362DD549548C404D“})
回溯(最近一次呼叫最后一次):
文件“/Users/ruahman/swipe tech apps/rpm tornado/env/lib/python2.7/site packages/tornado/web.py”,第1221行,完成后输入
如果result.result()不是无:
文件“/Users/ruahman/swipe tech apps/rpm tornado/env/lib/python2.7/site packages/tornado/concurrent.py”,结果第129行
提升exc信息(自我信息)
文件“/Users/ruahman/swipe tech apps/rpm tornado/env/lib/python2.7/site packages/tornado/stack_context.py”,第302行,包装
ret=fn(*args,**kwargs)
文件“/Users/ruahman/swipe tech apps/rpm tornado/env/lib/python2.7/site packages/tornado/gen.py”,第574行,内部
self.set_结果(键、结果)
文件“/Users/ruahman/swipe tech apps/rpm tornado/env/lib/python2.7/site packages/tornado/gen.py”,第500行,在集合结果中
self.run()
文件“/Users/ruahman/swipe tech apps/rpm tornado/env/lib/python2.7/site packages/tornado/gen.py”,第531行,运行中
已生成=self.gen.send(下一个)
文件“/Users/ruahman/swipe tech apps/rpm tornado/fabfile/server/request_handlers/orders.py”,第26行,在get中
自抛光(u“hi”,)
文件“/Users/ruahman/swipe-tech-apps/rpm-tornado/env/lib/python2.7/site-packages/tornado/web.py”,第810行,完成
self.write(块)
文件“/Users/ruahman/swipe tech apps/rpm tornado/env/lib/python2.7/site packages/tornado/web.py”,第610行,以书面形式
块=utf8(块)
文件“/Users/ruahman/swipe-tech-apps/rpm-tornado/env/lib/python2.7/site-packages/tornado/escape.py”,第203行,utf8格式
应为字节、unicode或无;获取了%r”%type(值)
TypeError:应为字节、unicode或无;得到了
错误:tornado。访问:500获取/订单/提交(127.0.0.1)8424.93ms
当我归还字典时,我没有这个问题。它只在我返回数组时发生。
是的,我可以将列表嵌入到对象中,但我更喜欢结果是数组。

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

self.finish({'someList': someList})
如果您坚持直接返回列表,您可以自己对其进行JSON编码:

self.finish(json.dumps(someList))
以下是与在web API中使用顶级JSON数组相关的安全漏洞的说明:


还有什么我可以回答的吗,或者你会接受这个答案吗?@a-jesse-jiryu-davis你提到返回阵列是一种安全风险,我试着读过,但找不到任何可信的答案。有没有可能分享一些我能读到的很好的参考资料。我已经更新了我的答案,其中有一个链接指向该漏洞的流行解释。谢谢,非常感谢:)@a.JesseJiryuDavis,一个简单的问题:当你自己对数据进行JSON编码,然后通过调用
self.finish(JSON编码的数据)
返回数据时,您是否需要设置适当的响应标题,或者这是由Tornado自动处理的(就像
self.finish(某些命令)
的情况一样)?