# -*- coding: utf-8 -*-
from logging import getLogger
from sanic import Sanic
from jetfactory.log import LOGGING_CONFIG_DEFAULTS
from .settings import ApplicationSettings
from .error import JetErrorHandler
from .manager import jetmgr
[docs]class Application(Sanic):
"""Creates a Jetfactory application
:param packages: List of (<path>, <package>)
:param path: Application root path
:param settings: Settings overrides
:param kwargs: kwargs to pass along to Sanic
"""
def __init__(self, packages=None, path='/api', settings=None, **kwargs):
if not packages:
raise Exception(f'jetfactory.Application expects an iterable of packages, got: {type(packages)}')
self.packages = packages
try:
overrides = dict(settings or {})
except ValueError:
raise Exception('Application `settings` must be a collection')
for name, logger in LOGGING_CONFIG_DEFAULTS['loggers'].items():
logger['level'] = 'DEBUG' if overrides.get('DEBUG') else 'INFO'
super(Application, self).__init__(
kwargs.pop('name', 'jetfactory'),
log_config=kwargs.pop('log_config', LOGGING_CONFIG_DEFAULTS),
**kwargs
)
# Application root logger
self.log = getLogger('root')
# Apply known settings from ENV or provided `settings`
self.config.update(
ApplicationSettings(overrides, path).merged
)
self.error_handler = JetErrorHandler()
# Listeners
self.register_listener(jetmgr.attach, 'after_server_start')
self.register_listener(jetmgr.detach, 'after_server_stop')
[docs] def run(self, host=None, port=None, workers=None, debug=False, sql_log=False, access_log=False, **kwargs):
"""Starts the HTTP server
:param host: Listen host, defaults to 127.0.0.1
:param port: Listen port, defaults to 8080
:param workers: Number of workers, defaults to 1 per core.
:param debug: Debugging
:param sql_log: Log SQL-statements
:param access_log: Log requests
:param kwargs: Parameters to pass along to Sanic.run
"""
debug = debug or self.config['DEBUG']
workers = workers or self.config['WORKERS']
# Enable access and sql log by default in debug mode, otherwise disable if it wasn't explicitly enabled.
if debug:
self.log.warning('Debug mode enabled')
sql_log = sql_log is None or sql_log
access_log = access_log is None or access_log
if int(workers) > 1:
self.log.warning('Automatic reload DISABLED due to multiple workers')
# Configure SQL statement logging
getLogger('peewee').setLevel('DEBUG' if sql_log else 'INFO')
cfg = dict(
host=host or self.config['LISTEN_HOST'],
port=port or self.config['LISTEN_PORT'],
workers=workers,
debug=debug,
access_log=access_log,
**kwargs
)
self.log.info(f"Starting {cfg['workers']} worker(s) on address: {cfg['host']}:{cfg['port']}")
super(Application, self).run(**cfg)