tornado源碼中不支持在self.write()中直接傳入list對象,源代碼如下
def write(self, chunk):
if self._finished:
raise RuntimeError("Cannot write() after finish()")
if not isinstance(chunk, (bytes, unicode_type, dict)):
message = "write() only accepts bytes, unicode, and dict objects"
if isinstance(chunk, list):
message += ". Lists not accepted for security reasons; see http://www.tornadoweb.org/en/stable/web.html#tornado.web.RequestHandler.write"
raise TypeError(message)
if isinstance(chunk, dict):
chunk = escape.json_encode(chunk)
self.set_header("Content-Type", "application/json; charset=UTF-8")
chunk = utf8(chunk)
self._write_buffer.append(chunk)
但是在某些條件下我們需要傳list給前端便於前端解析,因此我們可以覆寫框架中的write(不建議)或者定義我們自己的write,我自己在自己定義的基類中定義了自己的write函數,代碼如下:
class BaseHandler(tornado.web.RequestHandler):
# 這是自己定義的基類,業務類繼承這個基類
def __init__(self, *argc, **kwarg):
super(BaseHandler, self).__init__(*argc, **kwarg)
def get_current_user(self):
return self.get_secure_cookie("user")
def get(self):
self.send_error(404)
def mywrite(self, chunk):
# 定義自己實現的write()方法
if self._finished:
raise RuntimeError("Cannot write() after finish()")
if not isinstance(chunk, (unicode_type, list, dict)):
message = "write() only accepts bytes, unicode, list and dict objects"
raise TypeError(message)
if isinstance(chunk, (list, dict)):
chunk = json.dumps(chunk).replace("</", "<\\/")
self.set_header("Content-Type", "application/json; charset=UTF-8")
chunk = utf8(chunk)
self._write_buffer.append(chunk)
def write_error(self, status_code, **kwargs):
if status_code == 404:
self.render('public/404.html')
elif status_code == 500:
self.render('public/500.html')
else:
self.write('error' + str(status_code))
下面是業務類,繼承了自己寫的基類BaseHandler
class BaseHandler(BaseHandler):
# 這是這里是業務類
def get(self):
a = [1,2,3,4,5]
self.mywrite(a)
