使用装饰器为tornado restful api做异常处理

公司正在启动对外供应数据的业务,是两个高手负责, 架构方面看起来很是浏览,nginx lua tornado的组合,识别一些自然语法,由ast语法树来解析构建规则。   遇到一个规范的问题,不是所有的第三方的调用是合法的,这里说的合法更多的是符不符合特定语法的规则,这里语法是dsl结构的, 请求的信息是放在request body体的。  

正如刚才所说的那样,我们将来会开放不少对外的、各种各样的接口,那么如何更加方便的返回异常的状态,换句话说,怎么让代码优美起来。  我们这里可以用装饰器, 装饰器的用法其实没啥.  我以前写过一篇装饰器做tornado登陆验证的文章,这个代码其实和今天要讲解的异常处理是一个道理。  回到正题,今我这里更多阐述下tornado利用装饰器做异常的处理。    也不罗嗦了,直接贴我临时写的调试代码….  大家可以直接跑进行测试。 


文章经常被爬,这里标注下文章的原文连接   

http://xiaorui.cc

http://xiaorui.cc/?p=1285


#coding:utf-8 


import tornado.httpserver 
import tornado.ioloop 
import tornado.options 
import tornado.web 
import time 
import os 


from tornado import gen 
from tornado.concurrent import run_on_executor 




from tornado.options import define, options 
define("port", default=8000, help="run on the given port", type=int) 


def exe(func): 
    def exe_f(self,*args,**kwargs): 
        print 'start .....' 
        try: 
            func(self,*args,**kwargs) 
            print 'nima %s'%res 
        except Exception,e: 
            print "问题是",e 
            self.write('ok') 
        else: 
            print 'ok' 
        print 'end ......' 
        return 
    return exe_f 


class IndexHandler(tornado.web.RequestHandler): 


    @exe 
    def get(self): 
        print "begin" 
        self.write('ok') 
        print aa 
        self.finish() 


if __name__ == "__main__": 
    tornado.options.parse_command_line() 
    app = tornado.web.Application(handlers=[(r"/sleep", IndexHandler)]) 
    http_server = tornado.httpserver.HTTPServer(app) 
    http_server.listen(options.port) 
    tornado.ioloop.IOLoop.instance().start() 

恩, 会发现我的代码很简单, 装饰器本来就简单, 我这里写了一个对于异常处理的函数, 然后又改成装饰器的用法。  这里需要注意的是,装饰器的继承参数里要涵盖self这个对象的。 不然你没法 self.write(“”)  



大家觉得文章对你有些作用! 如果想赏钱,可以用微信扫描下面的二维码,感谢!
另外再次标注博客原地址  xiaorui.cc

1 Response

  1. 王超 2015年4月17日 / 上午7:48

    谢谢分享

王超进行回复 取消回复

邮箱地址不会被公开。 必填项已用*标注