init
This commit is contained in:
99
web/api/__init__.py
Normal file
99
web/api/__init__.py
Normal file
@@ -0,0 +1,99 @@
|
||||
|
||||
""" 接口加载器
|
||||
"""
|
||||
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
|
||||
)
|
5
web/api/blueprint.py
Normal file
5
web/api/blueprint.py
Normal file
@@ -0,0 +1,5 @@
|
||||
from flask import Blueprint
|
||||
|
||||
root = Blueprint('root', __name__, url_prefix='/')
|
||||
#
|
||||
data = Blueprint('data', __name__, url_prefix='/data')
|
0
web/api/components/__init__.py
Normal file
0
web/api/components/__init__.py
Normal file
32
web/api/components/data.py
Normal file
32
web/api/components/data.py
Normal file
@@ -0,0 +1,32 @@
|
||||
import json
|
||||
import traceback
|
||||
|
||||
from nc_http.core import Response
|
||||
|
||||
from api.blueprint import data
|
||||
from commons.constants.material_task import MaterialTaskStatus
|
||||
from commons.models.material_task import MaterialTask
|
||||
from commons.services.data import DataService
|
||||
from core.extensions import siwa
|
||||
|
||||
|
||||
@data.route('/task/<int:task_id>/refresh', methods=['GET'])
|
||||
@siwa.doc(tags=[""], summary='')
|
||||
def refresh_task(task_id):
|
||||
with MaterialTask.atomic() as session:
|
||||
data = MaterialTask.get_by_id(task_id, session)
|
||||
if not data:
|
||||
pass
|
||||
data.status = MaterialTaskStatus.DOING
|
||||
session.flush()
|
||||
try:
|
||||
content = DataService.get_content(type=data.type)
|
||||
data.content = json.dumps(content, ensure_ascii=False)
|
||||
data.status = MaterialTaskStatus.DONE
|
||||
session.flush()
|
||||
except Exception as e:
|
||||
traceback.print_exc()
|
||||
data.status = MaterialTaskStatus.FAILED
|
||||
session.flush()
|
||||
|
||||
return Response()
|
53
web/api/components/root.py
Normal file
53
web/api/components/root.py
Normal file
@@ -0,0 +1,53 @@
|
||||
import json
|
||||
import os
|
||||
from logging import getLogger
|
||||
|
||||
import requests
|
||||
from flask import request, send_file
|
||||
from nc_http.core import Response
|
||||
from nc_http.core.request.func import get_client_ip, get_request_json
|
||||
|
||||
import config
|
||||
from api.blueprint import root
|
||||
from commons import meta
|
||||
from tasks import once
|
||||
|
||||
LOGGER = getLogger('root')
|
||||
|
||||
|
||||
@root.route('')
|
||||
def root_check():
|
||||
# 测试服务是否启动
|
||||
return 'ok'
|
||||
|
||||
|
||||
@root.route('/ip')
|
||||
def get_ip():
|
||||
# 获取客户端 ip
|
||||
ip = get_client_ip(request)
|
||||
return Response(ip)
|
||||
|
||||
|
||||
@root.route('/debug/c', methods=['POST'])
|
||||
def test_es():
|
||||
data = get_request_json()
|
||||
url = "{}/one-map-data/_search".format(config.ES_HOSTS)
|
||||
headers = {'Content-Type': 'application/json'}
|
||||
result = requests.post(url, json.dumps(data), headers=headers)
|
||||
return Response(json.loads(result.content))
|
||||
|
||||
|
||||
@root.route('/debug/run_once/<string:task_name>', methods=['GET'])
|
||||
def run_once_task(task_name):
|
||||
if not config.DEBUG:
|
||||
raise meta.NO_CONTENT
|
||||
|
||||
task = getattr(once, task_name)
|
||||
|
||||
return Response(task())
|
||||
|
||||
|
||||
@root.route('/logs', methods=['GET'])
|
||||
def download_log_file():
|
||||
log_file = os.path.join(config.LOG_DIR, 'app.log')
|
||||
return send_file(log_file, as_attachment=True, download_name='geological-map-api.log', mimetype='text/plain')
|
Reference in New Issue
Block a user