class BaseHandler(RequestHandler): def __init__(self, *args, **kwargs): super(BaseHandler, self).__init__(*args, **kwargs) self.session = Session(self) self.db = self.application.db if not isinstance(self, WebSocketHandler): # record last view url self.set_cookie('last_view', self.request.uri) # 一天后过期, 防盗链 self.set_cookie('uuid', self.uuid, expires_days=1) def on_finish(self): self.session.save() def non_block_call(self, func, *args, **kwargs): return IOLoop.instance().add_callback(func, *args, **kwargs) @property def uuid(self): """ unique user identification """ return uuid.uuid3(uuid.NAMESPACE_DNS, self.ip).hex def is_human(self): return self.uuid == self.get_cookie('uuid') def get_current_user(self, user_id=None): """ if you want a cached version of `get_current_user`, you can use `current_user` """ return self.muser.get_user(user_id or self.user_id) def get_pure_user(self, user=None): """ 被客户端接收的用户信息, 不包含权限等客户端无关信息 """ user = user or self.current_user return { 'nickname': user['nickname'], 'avatar': user['avatar'], 'intro': user['intro'], 'motto': user['motto'], } @property def user_id(self): return self.session.get("uid") @property def muser(self): """ model of user """ if not hasattr(self, "_user_model"): self._user_model = user.UserModel(self.db) return self._user_model @property def mgroup(self): if not hasattr(self, "_group_model"): self._group_model = group.GroupModel(self.db) return self._group_model @property def marticle(self): if not hasattr(self, "_article_model"): self._article_model = article.ArticleModel(self.db) return self._article_model def get_argument(self, name, default=None): return super(BaseHandler, self).get_argument(name, default) def has_argument(self, name): return name in self.request.arguments @property def args(self): if not hasattr(self, '_args'): self._args = {} return self._args def get_args(self, *args, **newnames): for name in args: newname = newnames.get(name, name) self.get_arg(name, newname=newname) return self.args def get_arg(self, name, default=None, newname=None): value = self.get_argument(name, default) name = newname or name self.args[name] = value return value def set_arg(self, name, value): if self.has_arg(name) is None: return None self.args[name] = value return value def has_arg(self, name): return self.args.get(name) def check_arg(self, name, func, result=True, errmsg=None): """ 调用`func`检查指定参数. 若参数不存在, 则返回`default`, 否则返回`func`返回值 """ value = self.args.get(name) if value and func(value) != result: if not errmsg: errmsg = 'invalid ' + name raise Exception(errmsg) @property def ip(self): return self.request.remote_ip def get_module_path(self): module_path = os.path.join(self.get_template_path(), "modules") return module_path def render_module_string(self, module_name, **kwargs): module_path = self.get_module_path() return self.render_string(os.path.join(module_path, module_name), **kwargs) def render_404_page(self): self.render('404.html') def get(self): self.render_404_page() def post(self): self.write_error(403) def message2json(self, msg, errno=0): return json_encode({"msg": msg, "errno": errno}) def write_result(self, msg='', errno=0): """ :errno 错误码, 0=正常, 0<出错, 0>出错但未设置错误码 """ self.write(self.message2json(msg, errno)) def write_errmsg(self, msg='', errno=-1): self.write_result(str(msg), errno) def write_json(self, data, errmsg='unknown error'): """ 若data为空值, 发送err指定的错误信息 """ if data is None or data == '': self.write_errmsg(errmsg) elif isinstance(data, (basestring, str, unicode)): self.write(data) else: self.write(json_encode(data))