diff --git a/izzylib/__init__.py b/izzylib/__init__.py index 3dca767..6893a4b 100644 --- a/izzylib/__init__.py +++ b/izzylib/__init__.py @@ -32,31 +32,31 @@ def log_import_error(package, *message): traceback.print_exc() -try: - from izzylib.sql import SqlColumn, CustomRows, SqlSession, SqlDatabase, Tables, SqliteClient, SqliteColumn, SqliteServer, SqliteSession -except ImportError: - log_import_error('sql', 'Failed to import SQL classes. Connecting to SQL databases is disabled') +#try: + #from izzylib.sql import SqlColumn, CustomRows, SqlSession, SqlDatabase, Tables, SqliteClient, SqliteColumn, SqliteServer, SqliteSession +#except ImportError: + #log_import_error('sql', 'Failed to import SQL classes. Connecting to SQL databases is disabled') -try: - from izzylib.tinydb import TinyDatabase, TinyRow, TinyRows -except ImportError: - log_import_error('tinydb', 'Failed to import TinyDB classes. TinyDB database is disabled') +#try: + #from izzylib.tinydb import TinyDatabase, TinyRow, TinyRows +#except ImportError: + #log_import_error('tinydb', 'Failed to import TinyDB classes. TinyDB database is disabled') -try: - from izzylib.template import Template, Color -except ImportError: - log_import_error('template', 'Failed to import http template classes. Jinja and HAML templates disabled') +#try: + #from izzylib.template import Template, Color +#except ImportError: + #log_import_error('template', 'Failed to import http template classes. Jinja and HAML templates disabled') -try: - from izzylib.http_urllib_client import * +#try: + #from izzylib.http_urllib_client import * -except ImportError: - log_import_error('http_urllib_client', 'Failed to import Requests http client classes. Requests http client is disabled') +#except ImportError: + #log_import_error('http_urllib_client', 'Failed to import Requests http client classes. Requests http client is disabled') -try: - from izzylib.http_server import PasswordHasher, HttpServer, HttpServerRequest, HttpServerResponse -except ImportError: - log_import_error('http_server', 'Failed to import HTTP server classes. The HTTP server will be disabled') +#try: + #from izzylib.http_server import PasswordHasher, HttpServer, HttpServerRequest, HttpServerResponse +#except ImportError: + #log_import_error('http_server', 'Failed to import HTTP server classes. The HTTP server will be disabled') try: from izzylib import dbus diff --git a/izzylib/http_server/application.py b/izzylib/http_server/application.py index ecf7727..13f1829 100644 --- a/izzylib/http_server/application.py +++ b/izzylib/http_server/application.py @@ -1,6 +1,7 @@ import logging,multiprocessing, sanic, signal, traceback +from functools import partial from multidict import CIMultiDict from multiprocessing import cpu_count, current_process from urllib.parse import parse_qsl @@ -149,7 +150,7 @@ class Application(sanic.Sanic): if self.cfg.access_log: self.add_middleware(AccessLog) - msg = f'Starting {self.cfg.name} at {self.cfg.host}:{self.cfg.port}' + msg = f'Starting {self.cfg.name} at {self.cfg.listen}:{self.cfg.port}' if self.cfg.workers > 1: msg += f' with {self.cfg.workers} workers' @@ -160,13 +161,14 @@ class Application(sanic.Sanic): port = self.cfg.port, workers = self.cfg.workers, access_log = False, - debug = False + debug = False, + register_sys_signals = False ) - def finish(self): + def finish(self, *args): if self.cfg.sig_handler: - self.cfg.sig_handler(*self.cfg.sig_handler_args, **self.cfg.sig_handler_kwargs) + self.cfg.sig_handler(self, *self.cfg.sig_handler_args, **self.cfg.sig_handler_kwargs) self.stop() izzylog.info('Bye! :3') diff --git a/izzylib/http_server/config.py b/izzylib/http_server/config.py index 2af7cca..29c45d2 100644 --- a/izzylib/http_server/config.py +++ b/izzylib/http_server/config.py @@ -50,6 +50,9 @@ class Config(DotDict): super().__init__({**self.defaults, **kwargs}) + if not kwargs.get('host'): + self.host = self.listen + if kwargs.get('host') and not kwargs.get('web_host'): self.web_host = self.host diff --git a/izzylib/http_server/view.py b/izzylib/http_server/view.py index 3db5743..3740c13 100644 --- a/izzylib/http_server/view.py +++ b/izzylib/http_server/view.py @@ -1,3 +1,4 @@ +from sanic.exceptions import SanicException from sanic.views import HTTPMethodView from .response import Response @@ -14,8 +15,13 @@ class View(HTTPMethodView): self.app = request.app self.cfg = request.app.cfg + response = Response(self.app, request) handler = getattr(self, request.method.lower(), None) - return handler(request, Response(self.app, request), *args, **kwargs) + + if not handler: + raise SanicException('Method not supported', status_code=405) + + return handler(request, response, *args, **kwargs) ### Frontend Template Views ### diff --git a/izzylib/misc.py b/izzylib/misc.py index 5927884..d1e2006 100644 --- a/izzylib/misc.py +++ b/izzylib/misc.py @@ -8,6 +8,7 @@ from urllib.parse import urlparse from . import izzylog from .dotdict import DotDict +from .path import Path __all__ = [ @@ -29,6 +30,7 @@ __all__ = [ 'time_function_pprint', 'timestamp', 'var_name', + 'Config', 'Url' ] @@ -464,6 +466,44 @@ def var_name(single=True, **kwargs): return key[0] if single else keys +class Config(DotDict): + def __init__(self, json_file=None, **defaults): + self._defaults = defaults + self._json = Path(json_file) + + super().__init__(defaults) + + + def __setitem__(self, key, value): + if not key in self._defaults: + raise KeyError(f'Not a valid config option: {key}') + + super().__setitem__(key, value) + + + def reset(self, key=None): + if not key: + self.update(self._defaults) + + else: + self[key] = self._defaults[key] + + + def load(self): + try: + self.load_json(self._json) + return True + + except FileNotFoundError: + izzylog.warning('Cannot find path to config file:', self._json) + return False + + + def save(self, indent='\t'): + self._json.parent.mkdir() + self.save_json(self._json, indent=indent) + + class Url(str): protocols = { 'http': 80,