Tornado应用笔记02-RequestHandler与Application

目录

12

jij

从本节内容开始, 接

class BaseHandler(tornado.web.RequestHandler):

    """
    执行后面任何的方法, 如GET/POST (统称为HTTP 动词(verb) 方法) 来处理相应的HTTP方法.
    这些方法可以通过使用下面的装饰器: gen.coroutine, return_future, 或 asynchronous 变成异步
    """

    """handler处理流程:

    - 首先进行初始化RequestHandler对象;

    - 调用自定义的initialize方法,进行相关的初始化操作

    - 根据Http请求的类型,判断是否支持该类请求,RequestHandler默认支持的方法包括
    GET、POST、HEAD、DELETE、PATCH、PUT、OPTIONS;

    - 如果支持,则调用prepare方法。如果不支持,raise 405 错误,

    - 调用相应的方法,get/post;

    - 调用write或者render方法;

    - 判断 _finished 属性设置为True,如果是,则结束该流程,如果没有,则转入下一步。

    - 调用finish方法,将数据写入返回流中。

    - 最后调用on_finish方法,释放相关的资源或变量。
    """

    """
    tornado 的返回数据由写入 chunk 确定, 返回的节点取决 finish 的调用,
    与 flask 不同, 在函数内的 return 的数据并不会被写入 chunk 中, return 的作用在于结束请求,
    如果数据写入了 chunk 中, 而没有调用 flush, 如果后面调用了 send_error, 那么 chunk 将被舍弃
    """

    # 支持不在列表中的方法, 可以复写类变量 SUPPORTED_METHODS
    SUPPORTED_METHODS = tornado.web.RequestHandler.SUPPORTED_METHODS + ('PROPFIND', )

    def initialize(self, **kwargs):
        """一次请求的初始化操作的地方, 可以连接数据库, 初始 logger , 设置参数等

        一种用法:
            class MyHandler(RequestHandler):
                def initialize(self, database):
                    self.database = database

            app = Application([
                    (r'/user/(.*)', MyHandler, dict(database=database)),
                ])
        """
        pass

    def prepare(self):
        """
        准备一次请求, 可做验证身份等操作
        """
        pass

    def on_finish(self):
        """
        结束一次请求
        """
        # 关闭 sql 连接
        self.db.close()

        # 记录异常信息, 无异常时 exc_msg == "None\n"
        exc_msg = traceback.format_exc()
        if exc_msg != 'None\n':
            self.log_exception(exc_msg)

    @property
    def db(self):
        """使用 self.db 调用 mysql 对象, 减少import"""
        return self.application.db

    @property
    def log(self):
        return self.application.log

    def get_current_user(self):
        """
        被 self.current_user 调用, 获取当前用户
        """
        user_id = self.get_secure_cookie('user_id')
        last_login_time = self.get_secure_cookie('last_login_time')
        if user_id is None:
            return None

        # r = redislib.getClient()
        # hashKey = hashlib.md5(str(user_id) + 'tou_tiao_admin').hexdigest()
        # self.user = r.hgetall(hashKey)
        self.user = {"id" : 0}
        if self.user is None:
            return None

        # 判断是否异地登录
        if int(last_login_time) != int(self.user['last_login_time']):
            return None

        return self.user["id"]

    def current_user(self):
        pass

    def set_default_headers(self):
        """设置响应的默认 HTTP HEADER, 非全局
        """
        headers = dict(
            Server='MY_SERVER',
            Date=datetime.datetime.now()
        )
        for k, v in headers.items():
            self.set_header(k, v)
        cookies = dict(
            foo='foo_cookie',
            bar='bar_cookie'
        )
        for k, v in cookies.items():
            self.set_cookie(k, v, expires_days=7)

    def get_json(self):
        """获取json数据"""
        if self.request.headers["Content-Type"] == "application/json":
            return json.loads(self.request.body)
        return None

    def api_response(self, status, data=None):
        """api 响应函数"""
        data = data if isinstance(data, dict) else {}
        json_response = {
            'status_code': status['code'],
            'status_msg': status['msg'],
            'data': data
        }
        self.log_info('response_info' + json.dumps(json_response, ensure_ascii=False, indent=4))
        self.write(json.dumps(json_response))

    def api_response_success(self, data=None):
        self.api_response(ALL_RIGHT, data)

    def api_response_exc(self, data=None):
        self.api_response(UNKNOWN_EXC, data)

    def write_error(self, status_code, **kwargs):
        """自定义错误页面, 非全局"""
        error_page = {
            404: self.error_page_404,
            500: self.error_page_500
        }.get(status_code, self.error_page_undefined)
        error_page(status_code)

    def error_page_404(self, status_code=404):
        self.render('404.html')

    def error_page_500(self, status_code=500):
        self.render('500.html')

    def send_error_404(self):
        self.send_error(404)

    def send_error_500(self):
        self.send_error(500)

    def error_page_undefined(self, status_code):
        self.render('error.html', status_code=status_code)

    def get_login_url(self):
        """
        与 tornado.web.authenticated 配合使用, 返回登录 uri
        非全局, 重写会覆盖 Application 中的全局设置
        """
        return '/login/'

    def log_debug(self, msg, *args, **kwargs):
        self.log.debug(msg, *args, **kwargs)

    def log_info(self, msg, *args, **kwargs):
        self.log.info(msg, *args, **kwargs)

    def log_warning(self, msg, *args, **kwargs):
        self.log.warning(msg, *args, **kwargs)

    def log_exception(self, msg, *args, **kwargs):
        self.log.exception(msg, *args, **kwargs)

    def db_get(self, query, *args, **kwargs):
        self.log_debug(query % args) if args else self.log_debug(query % kwargs)
        row = self.db.get(query, *args, **kwargs)
        return {} if row is None else row

    def db_query(self, query, *args, **kwargs):
        self.log_debug(query % args) if args else self.log_debug(query % kwargs)
        return self.db.query(query, *args, **kwargs)

    def db_row_count(self, query, row_count_filed, *args, **kwargs):
        self.log_debug(query % args) if args else self.log_debug(query % kwargs)
        return self.db_get(query, *args, **kwargs).get(row_count_filed, 0)

    def db_insert(self, query, *args, **kwargs):
        self.log_debug(query % args) if args else self.log_debug(query % kwargs)
        return self.db.insert(query, *args, **kwargs)

    def db_update(self, query, *args, **kwargs):
        self.log_debug(query % args) if args else self.log_debug(query % kwargs)
        return self.db.update(query, *args, **kwargs)

    def db_execute(self, query, *args, **kwargs):
        self.log_debug(query % args) if args else self.log_debug(query % kwargs)
        return self.db.execute(query, *args, **kwargs)

    def db_delete(self, query, *args, **kwargs):
        return self.db_execute(query, *args, **kwargs)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值