def delete(self, name): cli = Fdfs_client(self.conf_path) if not isinstance(name, bytes): name = name.encode() try: result = cli.delete_file(name) except FDFSError as e: raise errors.Error(errmsg=f'从FastDFS删除文件{name}失败:') from e logger.debug(f'FastDFS delete: {result}') if result[0] != 'Delete file successed.': raise errors.Error(errmsg=f'FastDFS删除文件{name}失败: {result}')
def download(self, name): cli = Fdfs_client(self.conf_path) if not isinstance(name, bytes): name = name.encode() try: result = cli.download_to_buffer(name) except FDFSError as e: raise errors.Error(errmsg=f'从FastDFS下载文件{name}失败:') from e # logger.debug(f'FastDFS download: {result}') content = result.get('Content') # remote_file_id = result.get('Remote file_id') # storage_ip = result.get('Storage IP') # size = result.get('Download size') return aes_decrypt(content, key=CONFIG.FILE_SECRET, a2b=False)
def save(self, user=None, *args, **kwargs): user = user or getattr(g, 'user', None) if user is None: raise errors.Error(errmsg='User is required') if 'created_by' in [c.name for c in self.__table__.columns]: self.created_by = user.user_id try: with db.auto_commit_db(): db.session.add(self) except sqlalchemy.exc.IntegrityError as e: if e.orig.args[0] == 1062: raise errors.DBParamValueDuplicate(errmsg=e) raise errors.DBStatementError(errmsg=e) except sqlalchemy.exc.StatementError as e: raise errors.DBStatementError(errmsg=e)
def upload(self, content, ext_name=None): cli = Fdfs_client(self.conf_path) if ext_name is not None: ext_name = ext_name.lstrip('.') fbuffer = aes_encrypt(content.read(), key=CONFIG.FILE_SECRET) result = cli.upload_by_buffer(fbuffer, file_ext_name=ext_name) logger.debug(f'FastDFS Upload: {result}') if result.get('Status') != 'Upload successed.': raise errors.Error(errmsg=f'上传文件到FastDFS失败: {result}') storage_ip = result.get('Storage IP') filename = result.get('Remote file_id') return { 'filename': filename.decode(), 'storage_ip': storage_ip.decode() }
def update(self, data, user=None, *args, **kwargs): user = user or getattr(g, 'user', None) if user is None: raise errors.Error(errmsg='User is required') if 'updated_by' in [c.name for c in self.__table__.columns]: self.updated_by = user.user_id try: with db.auto_commit_db(): for key, val in data.items(): if val is not None and hasattr(self, key): setattr(self, key, val) except sqlalchemy.exc.IntegrityError as e: if e.orig.args[0] == 1062: raise errors.DBParamValueDuplicate(errmsg=e) raise errors.DBStatementError(errmsg=e) except sqlalchemy.exc.StatementError as e: raise errors.DBStatementError(errmsg=e)
def on_exception(e): logger = logging.getLogger('on_exception') if isinstance(e, errors.Error): err = e logger.log(level=err.log_level, msg=err.log) elif (isinstance(e, werkzeug.exceptions.NotFound) and e.description == 'The requested URL was not found on the server. ' 'If you entered the URL manually ' 'please check your spelling and try again.'): err = errors.ResourceNotFound( errmsg=f'{e.description}:{request.path}') logger.log(level=err.log_level, msg=err.log) elif (isinstance(e, werkzeug.exceptions.MethodNotAllowed) and e.description == '405 Method Not Allowed: ' 'The method is not allowed for the requested URL.'): err = errors.MethodNotAllowed( errmsg=f'{e.description}:[{request.method}]{request.path}') logger.log(level=err.log_level, msg=err.log) else: err = errors.Error(errmsg=str(e)) logger.log(level=err.log_level, msg=err.log, exc_info=e) return err.to_dict_response()
def inner(*args, **kwargs): token = request.headers.get('token') api_key = request.headers.get('api_key') robot_id = request.headers.get('robot_id') if robot_required and robot_id is None: err = errors.RobotIdRequired() logger.log(level=err.log_level, msg=err.log) return err.to_dict_response() if token is not None: try: g.user = authenticate_by_token( token, resource_name=resource_name, permission_name=permission_name) g.auth_method = 'token' except errors.Error as e: logger.log(level=e.log_level, msg=e.log) return e.to_dict_response() if not g.user.role: err = errors.Error(errmsg='user`s role missing') logger.log(level=err.log_level, msg=err.log) return err.to_dict_response() if g.user.role.role_name not in required_roles: err = errors.ResourceAccessForbidden( errmsg='role forbidden') logger.log(level=err.log_level, msg=err.log) return err.to_dict_response() elif api_key is not None: try: g.user = get_user_by_ak(api_key, resource_name=resource_name, permission_name=permission_name) g.auth_method = 'ak' except errors.Error as e: logger.log(level=e.log_level, msg=e.log) return e.to_dict_response() if not g.user.role: err = errors.Error(errmsg='user`s role missing') logger.log(level=err.log_level, msg=err.log) return err.to_dict_response() if g.user.role.role_name not in required_roles: err = errors.ResourceAccessForbidden( errmsg='role forbidden') logger.log(level=err.log_level, msg=err.log) return err.to_dict_response() elif robot_id is not None: try: # g.robot = get_robot(robot_id) g.user = None if 'ip' not in request.headers: err = errors.AuthParamsRequired( errmsg='ip is required.') logger.log(level=err.log_level, msg=err.log) return err.to_dict_response() if request.headers['ip'] != g.robot.ip: err = errors.RobotInvalid(errmsg='Robot ip invalid') logger.log(level=err.log_level, msg=err.log) return err.to_dict_response() g.auth_method = 'robot_id' except errors.RobotNotFound as e: logger.log(level=e.log_level, msg=e.log) return e.to_dict_response() else: err = errors.AuthParamsRequired() logger.log(level=err.log_level, msg=err.log) return err.to_dict_response() return func(*args, **kwargs)