Skip to content
Snippets Groups Projects
Commit 9808c29e authored by Robert Goldmann's avatar Robert Goldmann
Browse files

Added FlaskBaseApp

parent 9a44fcc4
No related branches found
No related tags found
No related merge requests found
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()
from PythonLibs.DefaultLogger import DefaultLogger from PythonLibs.DefaultLogger import DefaultLogger
from PythonLibs.MailHandler import MailHandler from PythonLibs.MailHandler import MailHandler
from PythonLibs.CachedService import CachedService from PythonLibs.CachedService import CachedService
from PythonLibs.FlaskBaseApp import FlaskBaseApp
...@@ -13,7 +13,9 @@ setup( ...@@ -13,7 +13,9 @@ setup(
install_requires=[ install_requires=[
], ],
setup_requires=[ setup_requires=[
'wheel' 'wheel',
'flask',
'gevent'
], ],
classifiers=[ classifiers=[
'Development Status :: 5 - Production/Stable', 'Development Status :: 5 - Production/Stable',
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment