50 lines
1.4 KiB
Python
50 lines
1.4 KiB
Python
import importlib
|
|
import os
|
|
import threading
|
|
import importlib.util
|
|
|
|
from __init__ import app
|
|
|
|
|
|
_config_mtime = None
|
|
_reload_lock = threading.RLock()
|
|
|
|
if "CONFIG" in os.environ:
|
|
config_path = os.environ["CONFIG"]
|
|
else:
|
|
config_path = os.path.join(app.root_path, 'config.py')
|
|
|
|
config_spec = importlib.util.spec_from_file_location("server.config", config_path)
|
|
config_module = importlib.util.module_from_spec(config_spec)
|
|
config_spec.loader.exec_module(config_module)
|
|
_cur_config = config_module.CONFIG
|
|
|
|
|
|
def get_config():
|
|
"""
|
|
Returns CONFIG dictionary from config.py module.
|
|
|
|
If config.py file was updated since the last call, get_config() reloads
|
|
the dictionary. If an error happens during reloading, get_config() returns
|
|
the old dictionary.
|
|
|
|
:returns: the newest valid version of the CONFIG dictionary
|
|
"""
|
|
|
|
global _config_mtime, _cur_config
|
|
|
|
cur_mtime = os.stat(config_path).st_mtime_ns
|
|
if cur_mtime != _config_mtime:
|
|
with _reload_lock:
|
|
if cur_mtime != _config_mtime:
|
|
try:
|
|
config_spec.loader.exec_module(config_module)
|
|
_cur_config = config_module.CONFIG
|
|
app.logger.info('New config loaded')
|
|
except Exception as e:
|
|
app.logger.error('Failed to reload config: %s', e)
|
|
|
|
_config_mtime = cur_mtime
|
|
|
|
return _cur_config
|