summaryrefslogtreecommitdiff
path: root/day9/task5_vue/backend
diff options
context:
space:
mode:
authorAndrew <saintruler@gmail.com>2019-07-23 19:31:43 +0400
committerAndrew <saintruler@gmail.com>2019-07-23 19:31:43 +0400
commit187723b567a9787f36ec251e00d73536b1825c0d (patch)
tree0635f286c8bc156324c4012419c2b79bf9c17a02 /day9/task5_vue/backend
parent0425296e5bc95ab94556ab09700844b1222dc077 (diff)
Добавлен модуль логгера.
Исправлены ошибки в классах типов полей базы данных. Добавлены файлы для использования Docker.
Diffstat (limited to 'day9/task5_vue/backend')
-rw-r--r--day9/task5_vue/backend/core/server.py4
-rw-r--r--day9/task5_vue/backend/database/database.py34
-rw-r--r--day9/task5_vue/backend/database/field_types.py25
-rw-r--r--day9/task5_vue/backend/database/wrappers.py7
-rw-r--r--day9/task5_vue/backend/logger/__init__.py24
-rw-r--r--day9/task5_vue/backend/settings.py4
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'