Files
judas_server/src/judas_server/web/web_server.py

75 lines
2.2 KiB
Python

# -*- coding: utf-8 -*-
from __future__ import annotations
import logging as lg
from typing import TYPE_CHECKING
from flask import Flask
from flask_login import LoginManager
from flask_socketio import SocketIO
from judas_server.web.user import load_user
if TYPE_CHECKING:
from judas_server.backend import BackendServer
class JudasWebServer:
def __init__(self, backend: BackendServer, secret_key: str) -> None:
self.logger: lg.Logger = lg.getLogger(
f"{__name__}.{self.__class__.__name__}"
)
self.logger.debug("Initializing JudasWebServer...")
self.backend: BackendServer = backend
self.app: Flask = Flask(
__name__, static_folder="static", template_folder="templates"
)
self.app.secret_key = secret_key
self.app.config["WEB_SERVER"] = self
self.app.config["BACKEND"] = self.backend
# hard-code password
self.app.config["PASSWORD"] = "123"
# extensions
self.login_manager: LoginManager = LoginManager()
self.socketio: SocketIO = SocketIO(self.app, cors_allowed_origins="*")
self.configure_extensions()
self.init_routes()
def configure_extensions(self) -> None:
self.logger.debug("Configuring extensions...")
self.login_manager.init_app(self.app)
self.login_manager.user_loader(load_user)
self.login_manager.login_view = "auth.login"
# TODO: add login page
def init_routes(self) -> None:
self.logger.debug("Initializing routes...")
from judas_server.web.routes import (
api,
auth_bp,
index_bp,
panel_bp,
client_details,
)
self.app.register_blueprint(index_bp)
self.app.register_blueprint(auth_bp)
self.app.register_blueprint(panel_bp)
self.app.register_blueprint(api.bp)
self.app.register_blueprint(client_details.bp)
api.emit_polled_data(self.app, self.socketio)
def run(self, host: str = "0.0.0.0", port: int = 5000) -> None:
self.logger.info(f"Starting web server on {host}:{port}...")
self.socketio.run(app=self.app, host=host, port=port)
self.logger.info("Server stopped.")