""" 接口加载器 """ from flask import g, Blueprint from nc_http.core import ResponseMeta from werkzeug.http import HTTP_STATUS_CODES import os import logging from logging.handlers import TimedRotatingFileHandler from importlib import import_module import glob from config import APP_MODE, API_ROOT LOGGER = logging.getLogger() def http_error_handler(err): # 忽略404日志记录 if err.code not in [400, 403, 404]: LOGGER.error(err) return ResponseMeta(code=err.code, http_code=err.code, description=err.name) def response_meta_handler(response_meta): return response_meta.get_response() def generic_error_handler(err): LOGGER.exception(err) if APP_MODE == 'Production': return ResponseMeta(http_code=500, description='出错了,请及时联系我们,我们的工程师将全力为您解决。') else: return ResponseMeta(http_code=500, description=str(err)) def before_request(): """ g.auth 授权之后 g.pagination 返回分页 """ # 自定义的请求头部 g.headers = {} def app_teardown(exc): pass def init_logger(app): log_dir = app.config.get('LOG_DIR') if log_dir: file_handler = TimedRotatingFileHandler(os.path.join(log_dir, 'app.log'), 'midnight', 1, 15) file_handler.suffix = '%Y%m%d' file_handler.setFormatter(logging.Formatter(app.config.get('LOG_FORMAT'))) file_handler.setLevel(logging.DEBUG) logger = logging.getLogger() logger.addHandler(file_handler) logger.setLevel(logging.DEBUG) # 初始化接口 def init_app(app): app.teardown_appcontext(app_teardown) app.before_request(before_request) for code in HTTP_STATUS_CODES: if code in [400, 401, 403, 404, 405, 406, 409, 500, 502, 503, 504]: app.register_error_handler(code, http_error_handler) app.register_error_handler(ResponseMeta, response_meta_handler) app.register_error_handler(Exception, generic_error_handler) # from api.helpers.db import main # main() # 注册接口 path = os.path.dirname(__file__) file_names = glob.glob(os.path.join(path, 'components', '*.py')) file_names = file_names + glob.glob(os.path.join(path, 'components', '**', '*.py')) for filename in file_names: filename = filename.replace(os.path.join(path, "components"), '').replace(os.sep, '.') module_name = os.path.basename(filename)[:-3] import_module('.components' + module_name, os.path.basename(path)) from . import blueprint for blueprint_name in dir(blueprint): if not blueprint_name.startswith('__'): bp = getattr(blueprint, blueprint_name) if isinstance(bp, Blueprint): app.register_blueprint( bp, url_prefix='{}{}'.format(API_ROOT, bp.url_prefix) if blueprint_name != 'root' else bp.url_prefix )