-
Notifications
You must be signed in to change notification settings - Fork 15
Expand file tree
/
Copy path__init__.py
More file actions
121 lines (96 loc) · 3.74 KB
/
Copy path__init__.py
File metadata and controls
121 lines (96 loc) · 3.74 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
# pylint: disable=invalid-name, missing-docstring
import datetime
import json
import logging
import os
import sys
import time
import pandas as pd
import numpy as np
import redis
from flask import Blueprint
from flask import Flask
from flask.json.provider import DefaultJSONProvider
from flask.logging import default_handler
from flask_cors import CORS
from rq import Queue
from pychunkedgraph.logging import jsonformatter
from . import config
from .meshing.legacy.routes import bp as meshing_api_legacy
from .meshing.v1.routes import bp as meshing_api_v1
from .segmentation.legacy.routes import bp as segmentation_api_legacy
from .segmentation.v1.routes import bp as segmentation_api_v1
from .segmentation.generic.routes import bp as generic_api
from .app_utils import get_instance_folder_path
class CustomJsonEncoder(json.JSONEncoder):
def __init__(self, int64_as_str=False, **kwargs):
super().__init__(**kwargs)
self.int64_as_str = int64_as_str
def default(self, obj):
if isinstance(obj, np.ndarray):
if self.int64_as_str and obj.dtype.type in (np.int64, np.uint64):
return obj.astype(str).tolist()
return obj.tolist()
elif isinstance(obj, np.generic):
if self.int64_as_str and obj.dtype.type in (np.int64, np.uint64):
return obj.astype(str).item()
return obj.item()
elif isinstance(obj, datetime.datetime):
return obj.__str__()
elif isinstance(obj, pd.DataFrame):
return obj.to_json()
return json.JSONEncoder.default(self, obj)
class CustomJSONProvider(DefaultJSONProvider):
def dumps(self, obj, **kwargs):
return super().dumps(obj, default=None, cls=CustomJsonEncoder, **kwargs)
def create_app(test_config=None):
app = Flask(
__name__,
instance_path=get_instance_folder_path(),
instance_relative_config=True,
)
app.json = CustomJSONProvider(app)
CORS(app, expose_headers="WWW-Authenticate")
configure_app(app)
if test_config is not None:
app.config.update(test_config)
app.register_blueprint(generic_api)
app.register_blueprint(meshing_api_legacy)
app.register_blueprint(meshing_api_v1)
app.register_blueprint(segmentation_api_legacy)
app.register_blueprint(segmentation_api_v1)
auth_bp = Blueprint("auth_info", __name__, url_prefix="/")
@auth_bp.route("/auth_info")
def index():
return {"login_url": "https://globalv1.flywire-daf.com/sticky_auth"}
app.register_blueprint(auth_bp)
return app
def configure_app(app):
# Load logging scheme from config.py
app_settings = os.getenv("APP_SETTINGS")
if not app_settings:
app.config.from_object(config.BaseConfig)
else:
app.config.from_object(app_settings)
app.config.from_pyfile("config.cfg", silent=True)
# Configure logging
# handler = logging.FileHandler(app.config['LOGGING_LOCATION'])
handler = logging.StreamHandler(sys.stdout)
handler.setLevel(app.config["LOGGING_LEVEL"])
formatter = jsonformatter.JsonFormatter(
fmt=app.config["LOGGING_FORMAT"], datefmt=app.config["LOGGING_DATEFORMAT"]
)
formatter.converter = time.gmtime
handler.setFormatter(formatter)
app.logger.removeHandler(default_handler)
app.logger.addHandler(handler)
app.logger.setLevel(app.config["LOGGING_LEVEL"])
app.logger.propagate = False
if app.config["USE_REDIS_JOBS"]:
app.redis = redis.Redis.from_url(app.config["REDIS_URL"])
app.test_q = Queue("test", connection=app.redis)
with app.app_context():
from ..ingest.rq_cli import init_rq_cmds
from ..ingest.cli import init_ingest_cmds
init_rq_cmds(app)
init_ingest_cmds(app)