obscreen/src/service/WebServer.py

80 lines
2.9 KiB
Python

import os
import time
from flask import Flask, send_from_directory
from src.service.ModelStore import ModelStore
from src.service.TemplateRenderer import TemplateRenderer
from src.controller.PlayerController import PlayerController
from src.controller.SlideshowController import SlideshowController
from src.controller.FleetController import FleetController
from src.controller.SysinfoController import SysinfoController
from src.controller.SettingsController import SettingsController
from src.constant.WebDirConstant import WebDirConstant
class WebServer:
MAX_UPLOADS = 16 * 1024 * 1024
def __init__(self, project_dir: str, model_store: ModelStore, template_renderer: TemplateRenderer):
self._project_dir = project_dir
self._model_store = model_store
self._template_renderer = template_renderer
self._debug = self._model_store.config().map().get('debug')
self.setup()
def run(self) -> None:
self._app.run(
host=self._model_store.config().map().get('bind'),
port=self._model_store.config().map().get('port'),
debug=self._debug
)
def setup(self) -> None:
self._setup_flask_app()
self._setup_web_globals()
self._setup_web_errors()
self._setup_web_controllers()
def get_app(self):
return self._app
def _get_template_folder(self) -> str:
return "{}/{}".format(self._project_dir, WebDirConstant.FOLDER_TEMPLATES)
def _get_static_folder(self) -> str:
return "{}/{}".format(self._project_dir, WebDirConstant.FOLDER_STATIC)
def _setup_flask_app(self) -> None:
self._app = Flask(
__name__,
template_folder=self._get_template_folder(),
static_folder=self._get_static_folder(),
)
self._app.config['UPLOAD_FOLDER'] = "{}/{}".format(WebDirConstant.FOLDER_STATIC, WebDirConstant.FOLDER_STATIC_WEB_UPLOADS)
self._app.config['MAX_CONTENT_LENGTH'] = self.MAX_UPLOADS
if self._debug:
self._app.config['TEMPLATES_AUTO_RELOAD'] = True
def _setup_web_controllers(self) -> None:
PlayerController(self._app, self._model_store, self._template_renderer)
SlideshowController(self._app, self._model_store, self._template_renderer)
SettingsController(self._app, self._model_store, self._template_renderer)
SysinfoController(self._app, self._model_store, self._template_renderer)
if self._model_store.variable().map().get('fleet_enabled').as_bool():
FleetController(self._app, self._model_store, self._template_renderer)
def _setup_web_globals(self) -> None:
@self._app.context_processor
def inject_global_vars() -> dict:
return self._template_renderer.get_view_globals()
def _setup_web_errors(self) -> None:
@self._app.errorhandler(404)
def not_found(e):
return send_from_directory(self._get_template_folder(), 'core/error404.html'), 404