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()

~~~

posted on 2020-04-04 08:19  江湖乄夜雨  阅读(263)  评论(0编辑  收藏  举报