目录
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)