1+ import os
12from ddb import DDB
2- from time import time
3+ from time import time , sleep
34from constfig import C
4- from flask import Flask , Response , request
5+ from flask import Flask , Response , request , abort
56
67
78pyxie = Flask (C .APP_NAME )
@@ -13,39 +14,54 @@ def _validate_api_key():
1314 return api_key in C .API_KEYS
1415
1516
17+ @pyxie .before_request
18+ def check_if_shutting_down ():
19+ # Since we're currently single threaded, we shouldn't really need this check. This is here
20+ # for any weird edge cases with flask.
21+ if C ._SHUTDOWN :
22+ abort (503 , description = "Service is shutting down. Please try again later." )
23+
24+
25+ @pyxie .before_request
26+ def validate_api_key ():
27+ if request .path == "/" or _validate_api_key ():
28+ return
29+ return "Unauthorized" , 401
30+
31+
32+ @pyxie .after_request
33+ def shutdown (response ):
34+ if C ._SHUTDOWN :
35+ _data .dump ()
36+ os ._exit (0 )
37+ return response
38+
39+
1640@pyxie .route ("/register" , methods = [C .HTTP_METHOD_POST ])
1741def register ():
18- if _validate_api_key ():
19- _data .register ()
20- return "Success" , 201
21- return "Unauthorized" , 401
42+ _data .register ()
43+ return "Success" , 201
2244
2345
2446@pyxie .route ("/unregister" , methods = [C .HTTP_METHOD_DELETE ])
2547def unregister ():
26- if _validate_api_key ():
27- _data .unregister ()
28- return "Success" , 204
29- return "Unauthorized" , 401
48+ _data .unregister ()
49+ return "Success" , 204
3050
3151
3252@pyxie .route ("/stats" , methods = [C .HTTP_METHOD_GET ])
3353def stats ():
34- if _validate_api_key ():
35- stats = {}
36- for attr in dir (_data ):
37- if isinstance (getattr (type (_data ), attr , None ), property ):
38- stats [attr ] = getattr (_data , attr )
39- return stats , 200
40- return "Unauthorized" , 401
54+ stats = {}
55+ for attr in dir (_data ):
56+ if isinstance (getattr (type (_data ), attr , None ), property ):
57+ stats [attr ] = getattr (_data , attr )
58+ return stats , 200
4159
4260
4361@pyxie .route ("/metrics" , methods = [C .HTTP_METHOD_GET ])
4462def metrics ():
4563 # [ TODO - Issue #7] - Export prometheus formatted metrics
46- if _validate_api_key ():
47- return "Metrics" , 501 # Not Implemented
48- return "Unauthorized" , 401
64+ return "Metrics" , 501 # Not Implemented
4965
5066
5167@pyxie .route ("/" , methods = [C .HTTP_METHOD_GET ])
@@ -58,6 +74,12 @@ def root():
5874 return Response (C .ONE_BY_ONE , mimetype = C .HTTP_MIME_TYPE_PNG )
5975
6076
77+ @pyxie .route ("/shutdown" , methods = [C .HTTP_METHOD_POST ])
78+ def shutdown ():
79+ C ._SHUTDOWN = True
80+ return "Service is now offline. Data will be saved." , 200
81+
82+
6183def main ():
6284 pyxie .run (host = C .LISTEN_IP , port = C .LISTEN_PORT )
6385
0 commit comments