diff options
| author | Andrew <saintruler@gmail.com> | 2019-07-23 19:31:43 +0400 |
|---|---|---|
| committer | Andrew <saintruler@gmail.com> | 2019-07-23 19:31:43 +0400 |
| commit | 187723b567a9787f36ec251e00d73536b1825c0d (patch) | |
| tree | 0635f286c8bc156324c4012419c2b79bf9c17a02 /day9/task5_vue/backend | |
| parent | 0425296e5bc95ab94556ab09700844b1222dc077 (diff) | |
Добавлен модуль логгера.
Исправлены ошибки в классах типов полей базы данных.
Добавлены файлы для использования Docker.
Diffstat (limited to 'day9/task5_vue/backend')
| -rw-r--r-- | day9/task5_vue/backend/core/server.py | 4 | ||||
| -rw-r--r-- | day9/task5_vue/backend/database/database.py | 34 | ||||
| -rw-r--r-- | day9/task5_vue/backend/database/field_types.py | 25 | ||||
| -rw-r--r-- | day9/task5_vue/backend/database/wrappers.py | 7 | ||||
| -rw-r--r-- | day9/task5_vue/backend/logger/__init__.py | 24 | ||||
| -rw-r--r-- | day9/task5_vue/backend/settings.py | 4 |
6 files changed, 82 insertions, 16 deletions
diff --git a/day9/task5_vue/backend/core/server.py b/day9/task5_vue/backend/core/server.py index 7c284c1..a809760 100644 --- a/day9/task5_vue/backend/core/server.py +++ b/day9/task5_vue/backend/core/server.py @@ -3,8 +3,8 @@ from urllib.parse import parse_qs from backend.core.router import run from backend.core.utils import parse_multipart_form +from backend.logger import Logger -import logging import json @@ -61,5 +61,5 @@ class MyHTTPRequestHandler(BaseHTTPRequestHandler): def start_server(host, port): server_address = (host, port) httpd = HTTPServer(server_address, MyHTTPRequestHandler) - logging.getLogger('tableApp').info(f'Server started on {host}:{port}') + Logger.get_logger().info(f'Server started on {host}:{port}') httpd.serve_forever() diff --git a/day9/task5_vue/backend/database/database.py b/day9/task5_vue/backend/database/database.py index 87982cf..44554c7 100644 --- a/day9/task5_vue/backend/database/database.py +++ b/day9/task5_vue/backend/database/database.py @@ -1,27 +1,47 @@ from backend.database.wrappers import Wrapper, MySQLWrapper +from backend.logger import Logger -import logging +from time import sleep def initialize_databases(configs, schemes): + timeout = 5 + max_retries = 7 + for config in configs: if config['type'] == 'mysql': - logger = logging.getLogger('backendDebug') - - logger.debug('Connected') - logger.debug(f'Trying to connect to database "{config["db_name"]}@{config["host"]}"...') + for _ in range(max_retries): + try: + Logger.get_logger().info(f'Trying to connect to database "{config["db_name"]}@{config["host"]}"...') + wrapper = MySQLWrapper(config['host'], config['username'], config['password'], config['db_name']) + Logger.get_logger().info('Connected.') + break + except Exception as e: + Logger.get_logger().info(f'Connection failed. Reason: "{e}";\nTrying again...') + sleep(timeout) + else: + Logger.get_logger().critical( + f'Failed to connect to "{config["db_name"]}@{config["host"]}". ' + f'Check that database and then restart this service.' + ) + continue - wrapper = MySQLWrapper(config['host'], config['username'], config['password'], config['db_name']) wrappers[config['name']] = wrapper cursor = wrapper.connection.cursor() for scheme in schemes: - logger.debug(f'Preparing table "{scheme.meta["name"]}"...') + Logger.get_logger().info(f'Preparing table "{scheme.meta["name"]}"...') cursor.execute('START TRANSACTION; {} COMMIT;'.format(scheme.get_create_line())) wrapper.schemes[scheme.meta['name']] = scheme cursor.close() +def shutdown_databases(): + Logger.get_logger().info('Shutting down databases...') + for wrapper in wrappers: + wrapper.close_connection() + + def get_wrapper_for(database_name) -> Wrapper: return wrappers.get(database_name, None) diff --git a/day9/task5_vue/backend/database/field_types.py b/day9/task5_vue/backend/database/field_types.py index 8713882..9f5bfe8 100644 --- a/day9/task5_vue/backend/database/field_types.py +++ b/day9/task5_vue/backend/database/field_types.py @@ -38,8 +38,11 @@ class TextField(Field): 'NULL' if self.nullable else 'NOT NULL' ] - if self.default is not None or self.nullable: + if self.default is not None: request.append(f'DEFAULT "{self.default}"') + else: + if self.nullable: + request.append('DEFAULT NULL') return ' '.join(request) @@ -62,8 +65,11 @@ class IntegerField(Field): 'NULL' if self.nullable else 'NOT NULL' ] - if self.default is not None or self.nullable: + if self.default is not None: request.append(f'DEFAULT "{self.default}"') + else: + if self.nullable: + request.append('DEFAULT NULL') if self.is_auto_increment: request.append('AUTO_INCREMENT') @@ -84,8 +90,11 @@ class DateField(Field): def sql_line(self): request = ['date', 'NULL' if self.nullable else 'NOT NULL'] - if self.default is not None or self.nullable: + if self.default is not None: request.append(f'DEFAULT "{self.default}"') + else: + if self.nullable: + request.append('DEFAULT NULL') return ' '.join(request) @@ -103,8 +112,11 @@ class TimeField(Field): def sql_line(self): request = ['time', 'NULL' if self.nullable else 'NOT NULL'] - if self.default is not None or self.nullable: + if self.default is not None: request.append(f'DEFAULT "{self.default}"') + else: + if self.nullable: + request.append('DEFAULT NULL') return ' '.join(request) @@ -122,7 +134,10 @@ class DatetimeField(Field): def sql_line(self): request = ['datetime', 'NULL' if self.nullable else 'NOT NULL'] - if self.default is not None or self.nullable: + if self.default is not None: request.append(f'DEFAULT "{self.default}"') + else: + if self.nullable: + request.append('DEFAULT NULL') return ' '.join(request) diff --git a/day9/task5_vue/backend/database/wrappers.py b/day9/task5_vue/backend/database/wrappers.py index 30d34d9..5bb9761 100644 --- a/day9/task5_vue/backend/database/wrappers.py +++ b/day9/task5_vue/backend/database/wrappers.py @@ -8,6 +8,10 @@ class Wrapper(ABC): self.schemes = {} @abstractmethod + def close_connection(self): + pass + + @abstractmethod def clear_table(self, table_name): pass @@ -46,6 +50,9 @@ class MySQLWrapper(Wrapper): db=db_name ) + def close_connection(self): + self.connection.close() + def clear_table(self, table_name): cursor = self.connection.cursor() cursor.execute(f"START TRANSACTION; DELETE FROM `{table_name}`; COMMIT;") diff --git a/day9/task5_vue/backend/logger/__init__.py b/day9/task5_vue/backend/logger/__init__.py new file mode 100644 index 0000000..44ca462 --- /dev/null +++ b/day9/task5_vue/backend/logger/__init__.py @@ -0,0 +1,24 @@ +import logging +from sys import stdout + +from typing import Optional +from logging import Logger as BuiltinLogger + + +class Logger: + _instance: Optional[BuiltinLogger] = None + + @staticmethod + def get_logger(): + if Logger._instance is None: + logger = logging.getLogger(__name__) + logger.setLevel(logging.DEBUG) + + sh = logging.StreamHandler(stdout) + formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') + sh.setFormatter(formatter) + logger.addHandler(sh) + + Logger._instance = logger + + return Logger._instance diff --git a/day9/task5_vue/backend/settings.py b/day9/task5_vue/backend/settings.py index 2271672..4616ea3 100644 --- a/day9/task5_vue/backend/settings.py +++ b/day9/task5_vue/backend/settings.py @@ -1,6 +1,6 @@ STATIC_FILES_PATH = 'static' -SERVER_HOST = '' +SERVER_HOST = '0.0.0.0' SERVER_PORT = 8000 DEBUG_MODE = True @@ -10,7 +10,7 @@ DATABASES = [ 'type': 'mysql', 'name': 'mysql', - 'host': 'pcserv2', + 'host': 'mysql', 'username': 'day9', 'password': 'day9', 'db_name': 'day9' |