-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathapp_ztf.py
More file actions
109 lines (91 loc) · 3.78 KB
/
app_ztf.py
File metadata and controls
109 lines (91 loc) · 3.78 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
# Copyright 2024-2025 AstroLab Software
# Author: Julien Peloton
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import os
from flask import Blueprint, Flask
from flask_restx import Api
from prometheus_client import values
from prometheus_client.values import MultiProcessValue
from prometheus_flask_exporter.multiprocess import GunicornPrometheusMetrics
from apps import __version__
from apps.routes.v1.ztf.anomaly.api import ns as ns_anomaly
from apps.routes.v1.ztf.classes.api import ns as ns_classes
from apps.routes.v1.ztf.conesearch.api import ns as ns_conesearch
from apps.routes.v1.ztf.cutouts.api import ns as ns_cutouts
from apps.routes.v1.ztf.latests.api import ns as ns_latests
from apps.routes.v1.ztf.metadata.api import ns as ns_metadata
from apps.routes.v1.ztf.objects.api import ns as ns_objects
from apps.routes.v1.ztf.resolver.api import ns as ns_resolver
from apps.routes.v1.ztf.schema.api import ns as ns_schema
from apps.routes.v1.ztf.skymap.api import ns as ns_skymap
from apps.routes.v1.ztf.sso.api import ns as ns_sso
from apps.routes.v1.ztf.ssobulk.api import ns as ns_ssobulk
from apps.routes.v1.ztf.ssocand.api import ns as ns_ssocand
from apps.routes.v1.ztf.ssoft.api import ns as ns_ssoft
from apps.routes.v1.ztf.statistics.api import ns as ns_statistics
from apps.routes.v1.ztf.tracklet.api import ns as ns_tracklet
from apps.utils.utils import extract_configuration
from config_prometheus import child_exit, post_fork, pre_fork
config = extract_configuration("config.yml")
def get_worker_id():
"""Return stable id for worker"""
return os.environ.get("GUNICORN_WORKER_ID", str(os.getpid()))
# Overwrite ValueClass to use this id
values.ValueClass = MultiProcessValue(process_identifier=get_worker_id)
app = Flask("Fink/ZTF REST API")
metrics = GunicornPrometheusMetrics(app, group_by="endpoint")
# calls for a properly defined child_exit, pre_fork, post_fork
metrics.child_exit = child_exit
metrics.pre_fork = pre_fork
metrics.post_fork = post_fork
# Master blueprint
blueprint = Blueprint("api", __name__, url_prefix="/")
api = Api(
blueprint,
version=__version__,
title="Fink/ZTF object API",
description="REST API to access data from Fink",
)
# Enable CORS for this blueprint
@blueprint.after_request
def after_request(response):
response.headers.add("Access-Control-Allow-Origin", "*")
response.headers.add("Access-Control-Allow-Headers", "Content-Type,Authorization")
response.headers.add("Access-Control-Allow-Methods", "GET,PUT,POST,DELETE,OPTIONS")
return response
# Server configuration
app.config["MAX_CONTENT_LENGTH"] = 100 * 1024 * 1024
app.config["JSONIFY_PRETTYPRINT_REGULAR"] = True
app.config["JSON_SORT_KEYS"] = False
# Register namespace
api.add_namespace(ns_objects)
api.add_namespace(ns_cutouts)
api.add_namespace(ns_latests)
api.add_namespace(ns_classes)
api.add_namespace(ns_conesearch)
api.add_namespace(ns_sso)
api.add_namespace(ns_ssocand)
api.add_namespace(ns_resolver)
api.add_namespace(ns_tracklet)
api.add_namespace(ns_schema)
api.add_namespace(ns_skymap)
api.add_namespace(ns_statistics)
api.add_namespace(ns_anomaly)
api.add_namespace(ns_ssoft)
api.add_namespace(ns_metadata)
api.add_namespace(ns_ssobulk)
# Register blueprint
app.register_blueprint(blueprint)
if __name__ == "__main__":
app.run(config["HOST"], debug=True, port=int(config["PORT"]))