tornado框架在handler类中进行统一校验的写法与“被调用函数return的作用范围的说明”
# -*- coding:utf-8 -*- import tornado.httpserver import tornado.ioloop from tornado.web import RequestHandler,Application import tornado.options from tornado.options import define,options from tornado.escape import json_decode,json_encode define("port",default=9002,help="run on the gevent port",type=int) define("host",default="127.0.0.1",help="host aaa",type=str) # handler中进行统一校验的函数 def check_method(obj): # 校验成功的标志 flag = True try: if not obj.check_token: obj.write({"result": "token校验失败"}) flag = False if not obj.check_sql: obj.write({"result": "有sql注入"}) flag =False if not obj.check_auth: obj.write({"result": "权限校验失败"}) flag = False except Exception as e: obj.write({"result": "failed"}) flag = False finally: # 如果flag为False执行finish if not flag: # finish下面的return 其实是handle函数的return 并不是post方法的return # 如果后面还有write的话需要捕获一下 RuntimeError 这个异常! obj.finish() # 这个return只是handle这个函数的return 不能作用于调用的地方 return flag class IndexHandler(RequestHandler): def post(self): print("------调用了post()方法------") ret = check_method(self) if not ret: # 当然这个return之后后面的逻辑就不会执行了,如果这里不加return的话,下面必须得捕获RuntimeError这个异常! return try: self.write({"name":"whw"}) ### 为了防止finish后面还有write方法,可以捕获一下这个RuntimeError这个异常 except RuntimeError: import logging logging.warning("Cannot write() after finish()") except Exception as e: print(e) def initialize(self): print("------调用了initialize()------") def prepare(self): print("------调用了prepare()------") # 在prepare中进行token校验、sql注入校验、权限校验 # 可以放在基类中,后面的子类继承它以后可以通过这三个属性来判断相关的判断是否成功了 self.check_token = True self.check_sql = True self.check_auth = True def set_default_headers(self): print("------调用了set_default_headers()------") def write_error(self, status_code, **kwargs): print("------调用了write_error()------") def on_finish(self): print("------调用了on_finish()------") if __name__ == '__main__': tornado.options.parse_command_line() app = Application( handlers = [ (r"/index",IndexHandler), ], debug = True, ) http_server = tornado.httpserver.HTTPServer(app) http_server.listen(options.port) tornado.ioloop.IOLoop.instance().start()
~~~