100 lines
2.9 KiB
Python
100 lines
2.9 KiB
Python
|
|
""" 接口加载器
|
|
"""
|
|
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
|
|
)
|