tornado中self.write() 寫list


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)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM