Source code for dasha.web
#! /usr/bin/env python
"""This module defines DashA web server globals."""
import os
from tollan.utils.log import get_logger, timeit, init_log, logit
from tollan.utils.fmt import pformat_yaml
from tollan.utils.env import env_registry
from wrapt import ObjectProxy
from contextlib import ExitStack
from .. import Site
# import signal
import atexit
__all__ = ['site', 'create_site', 'create_app']
# enable logging for the start up if flask development is set
if os.environ.get('FLASK_ENV', None) == 'development':
init_log(level='DEBUG')
else:
init_log(level='INFO')
site = ObjectProxy(None)
"""
A proxy to the `~dasha.core.Site` instance, which is made available after
`~dasha.web.create_site` is called.
"""
exit_stack = ExitStack()
""""
An `~contextlib.ExitStack` instance that can be used to register clean up
functions.
"""
[docs]@timeit
def create_site():
"""DashA entry point.
Call this function to make available the `~dasha.web.site` context.
Returns
-------
`~dasha.Site`
The site instance.
"""
logger = get_logger()
env_registry.clear()
env_registry.register(
'DASHA_SITE', 'The site module or path.',
'dasha.examples.dasha_intro')
env_registry.register('DASHA_LOGFILE', 'The file for logging.', None)
env_registry.register('DASHA_LOGLEVEL', 'The DashA log level.', 'Info')
logger.info(f"registered env vars:\n{pformat_yaml(env_registry)}")
site.__wrapped__ = Site.from_any(env_registry.get('DASHA_SITE'))
return site
[docs]@timeit
def create_app():
"""Flask entry point.
"""
logger = get_logger()
site = create_site()
logger.info(f"init dasha site:\n{pformat_yaml(site.to_dict())}")
server = site.init_app()
# reconfigure the logger
logfile = env_registry.get('DASHA_LOGFILE')
loglevel = env_registry.get('DASHA_LOGLEVEL')
logger.debug(f"reset logger: loglevel={loglevel} logfile={logfile}")
# python logging level is upper case.
init_log(level=loglevel.upper(), file_=logfile)
return server
def _exit():
logger = get_logger()
with logit(logger.info, 'dasha clean up'):
exit_stack.close()
atexit.register(_exit)
# signal.signal(signal.SIGTERM, _exit)
# signal.signal(signal.SIGINT, _exit)