From 9808c29eedf34221ef85bd0a870c8ee7e1cc3672 Mon Sep 17 00:00:00 2001 From: Robert Goldmann <deadlocker@gmx.de> Date: Sat, 2 May 2020 11:49:25 +0200 Subject: [PATCH] Added FlaskBaseApp --- PythonLibs/FlaskBaseApp.py | 94 ++++++++++++++++++++++++++++++++++++++ PythonLibs/__init__.py | 1 + setup.py | 4 +- 3 files changed, 98 insertions(+), 1 deletion(-) create mode 100644 PythonLibs/FlaskBaseApp.py diff --git a/PythonLibs/FlaskBaseApp.py b/PythonLibs/FlaskBaseApp.py new file mode 100644 index 0000000..560680c --- /dev/null +++ b/PythonLibs/FlaskBaseApp.py @@ -0,0 +1,94 @@ +import abc +import json +import logging +import os +from abc import ABC +from typing import Dict + +from flask import Flask, send_from_directory +from flask import jsonify +from gevent.pywsgi import WSGIServer + + +class FlaskBaseApp(ABC): + def __init__(self, appName: str, + rootDir: str, + logger: logging.Logger, + versionPath='version.json', + settingsPath='../settings.json', + serveFavicon=True, + serveRobotsTxt=False): + self._appName = appName + self._rootDir = rootDir + self._logger = logger + self._serveFavicon = serveFavicon + self._serveRobotsTxt = serveRobotsTxt + + self._version = self.__parse_version(versionPath) + self._settings = self.__parse_settings(settingsPath) + self._serverSettings = self._settings['server'] + + self._app = None + + @staticmethod + def __parse_version(versionPath: str) -> Dict: + with open(versionPath, 'r', encoding='UTF-8') as f: + version = json.load(f) + return version['version'] + + @staticmethod + def __parse_settings(settingsPath: str) -> Dict: + with open(settingsPath, 'r', encoding='UTF-8') as f: + return json.load(f) + + def __init_app(self): + app = Flask(self._rootDir) + app.secret_key = self._serverSettings['secret'] + + self.register_blueprints(app) + + @app.route('/version', methods=['GET']) + def version(): + return jsonify(self._version) + + if self._serveFavicon: + @app.route('/favicon.ico', methods=['GET']) + def favicon(): + return send_from_directory(os.path.join(app.root_path, 'static'), '../static/favicon.ico', + mimetype='image/vnd.microsoft.icon') + + if self._serveRobotsTxt: + @app.route('/robots.txt', methods=['GET']) + def robots(): + return send_from_directory(os.path.join(app.root_path, 'static'), '../static/robots.txt') + + return app + + @abc.abstractmethod + def register_blueprints(self, app): + pass + + def start_server(self): + self._app = self.__init_app() + + if self._serverSettings['useSSL']: + protocol = 'https' + http_server = WSGIServer((self._serverSettings['listen'], self._serverSettings['port']), + self._app, + keyfile=self._serverSettings['keyfile'], + certfile=self._serverSettings['certfile'], + log=self._logger) + else: + protocol = 'http' + http_server = WSGIServer((self._serverSettings['listen'], self._serverSettings['port']), + self._app, + log=self._logger) + + self._logger.info('{name} {versionName}({versionCode}) - ' + 'Listening on {protocol}://{listen}:{port}...'.format(name=self._appName, + versionName=self._version['name'], + versionCode=self._version['code'], + protocol=protocol, + listen=self._serverSettings['listen'], + port=self._serverSettings['port'])) + http_server.serve_forever() diff --git a/PythonLibs/__init__.py b/PythonLibs/__init__.py index 45e31a9..d5b258d 100644 --- a/PythonLibs/__init__.py +++ b/PythonLibs/__init__.py @@ -1,3 +1,4 @@ from PythonLibs.DefaultLogger import DefaultLogger from PythonLibs.MailHandler import MailHandler from PythonLibs.CachedService import CachedService +from PythonLibs.FlaskBaseApp import FlaskBaseApp diff --git a/setup.py b/setup.py index 7da1909..de806c2 100644 --- a/setup.py +++ b/setup.py @@ -13,7 +13,9 @@ setup( install_requires=[ ], setup_requires=[ - 'wheel' + 'wheel', + 'flask', + 'gevent' ], classifiers=[ 'Development Status :: 5 - Production/Stable', -- GitLab