From c208bc8181f907bdfeacab7fc37fd4f73d57578c Mon Sep 17 00:00:00 2001 From: singein Date: Thu, 8 Apr 2021 08:54:14 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=8C=E6=AD=A5=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DjangoAppCenter/dtos/__init__.py | 0 DjangoAppCenter/dtos/ret.py | 23 ++++++++ DjangoAppCenter/middlewares/__init__.py | 0 .../middlewares/exception_catcher.py | 19 ++++++ DjangoAppCenter/settings/__init__.py | 1 - DjangoAppCenter/settings/profile.py | 58 +++++++++++++++++++ tests/test_loader.py | 10 ++++ 7 files changed, 110 insertions(+), 1 deletion(-) create mode 100644 DjangoAppCenter/dtos/__init__.py create mode 100644 DjangoAppCenter/dtos/ret.py create mode 100644 DjangoAppCenter/middlewares/__init__.py create mode 100644 DjangoAppCenter/middlewares/exception_catcher.py create mode 100644 DjangoAppCenter/settings/profile.py create mode 100644 tests/test_loader.py diff --git a/DjangoAppCenter/dtos/__init__.py b/DjangoAppCenter/dtos/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/DjangoAppCenter/dtos/ret.py b/DjangoAppCenter/dtos/ret.py new file mode 100644 index 0000000..86285ba --- /dev/null +++ b/DjangoAppCenter/dtos/ret.py @@ -0,0 +1,23 @@ +class BaseRet: + ret: int + message: str + error_code: str + data: dict + + def to_dict(self): + return self.__dict__ + + @staticmethod + def success(message: str = None) -> dict: + base_ret = BaseRet() + base_ret.ret = 1 + base_ret.message = message + return base_ret.to_dict() + + @staticmethod + def fail(message: str = "System error", error_code: str = "10000") -> dict: + base_ret = BaseRet() + base_ret.ret = 0 + base_ret.message = message + base_ret.error_code = error_code + return base_ret.to_dict() diff --git a/DjangoAppCenter/middlewares/__init__.py b/DjangoAppCenter/middlewares/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/DjangoAppCenter/middlewares/exception_catcher.py b/DjangoAppCenter/middlewares/exception_catcher.py new file mode 100644 index 0000000..c24f3fe --- /dev/null +++ b/DjangoAppCenter/middlewares/exception_catcher.py @@ -0,0 +1,19 @@ +import logging + +from django.http import HttpResponseBadRequest, JsonResponse + +from DjangoAppCenter.dtos.ret import BaseRet +from settings.profile import SettingsLoaderError + +logger = logging.getLogger("exception") + + +class CustomException(object): + def process_exception(self, request, exception): + logger.exception(exception) + + if isinstance(exception, SettingsLoaderError): + return JsonResponse(BaseRet.fail(exception.message)) + + else: + return HttpResponseBadRequest() diff --git a/DjangoAppCenter/settings/__init__.py b/DjangoAppCenter/settings/__init__.py index 0d25bc0..5ed8a06 100644 --- a/DjangoAppCenter/settings/__init__.py +++ b/DjangoAppCenter/settings/__init__.py @@ -157,4 +157,3 @@ globals()[key].update(**value) else: globals().update(**{key: value}) -globals() diff --git a/DjangoAppCenter/settings/profile.py b/DjangoAppCenter/settings/profile.py new file mode 100644 index 0000000..6f8cfe9 --- /dev/null +++ b/DjangoAppCenter/settings/profile.py @@ -0,0 +1,58 @@ +import json +import logging +import os + +logger = logging.getLogger("admin") + + +class SettingsLoaderError(Exception): + pass + + +class SettingsLoader: + + def __init__(self, path: str): + if not os.path.exists(path): + raise SettingsLoaderError("Profile path not found") + + self.settings_path = path + + def load(self): + try: + return json.loads(open(self.settings_path, encoding="utf-8").read()) + except json.JSONDecodeError: + raise SettingsLoaderError("Json decode failed.") from json.JSONDecodeError + + def merge(self, app: str, options: str): + if not options: + return + try: + options = json.loads(options) + if not isinstance(options, dict): + logger.error(f"App[{app}] 配置文件解析错误 {options}") + return + + with open(CWD_SETTINGS_PATH, 'r', encoding="utf-8") as f: + profile = json.loads(f.read()) + for key, value in options.items(): + if isinstance(value, (list, tuple)): + try: + profile.update(**{key: list(set(profile.get(key, []) + value))}) + except TypeError: + profile.update(**{key: profile.get(key, []) + value}) + + elif isinstance(value, dict): + if not profile.get(key, None): + profile[key] = {} + profile[key].update(**value) + + else: + profile.update(**{key: value}) + + with open(CWD_SETTINGS_PATH, 'w', encoding="utf-8") as f: + f.write(json.dumps(profile, ensure_ascii=False, indent=2)) + + logger.info(f"App[{app}] settings success injected") + + except json.JSONDecodeError: + logger.error(f"App[{app}] 配置文件解析错误 {options}") diff --git a/tests/test_loader.py b/tests/test_loader.py new file mode 100644 index 0000000..9299184 --- /dev/null +++ b/tests/test_loader.py @@ -0,0 +1,10 @@ +import unittest + +from DjangoAppCenter.settings.loader import load_settings_from_file + + +class Test(unittest.TestCase): + + def test_load_settings_from_file(self): + settings = load_settings_from_file() + \ No newline at end of file