From 578fe10a9249db6fa1f6eb10dd69f8684b3fb9c3 Mon Sep 17 00:00:00 2001 From: th3r00t Date: Fri, 25 Nov 2022 14:44:03 -0500 Subject: [PATCH] Post refactor of FastAPI's router; uvicorns server --- pyShelf.py | 57 ++------------------------------- src/frontend/lib/frontend.py | 58 ++++++++++++++++++++++++++++++++++ src/frontend/static/styles.css | 0 3 files changed, 61 insertions(+), 54 deletions(-) create mode 100644 src/frontend/lib/frontend.py create mode 100644 src/frontend/static/styles.css diff --git a/pyShelf.py b/pyShelf.py index 05b5f54..b608e96 100755 --- a/pyShelf.py +++ b/pyShelf.py @@ -5,16 +5,10 @@ import sys from pathlib import Path from threading import Thread -import uvicorn -from fastapi import FastAPI, Request -from fastapi.responses import HTMLResponse -from fastapi.routing import APIRoute -from fastapi.staticfiles import StaticFiles -from fastapi.templating import Jinja2Templates - from src.backend.lib.config import Config from src.backend.pyShelf_MakeCollections import MakeCollections from src.backend.pyShelf_ScanLibrary import execute_scan +from src.frontend.lib.frontend import FrontendServer # import websockets @@ -22,9 +16,6 @@ root = Path.cwd() config = Config(root) PRG_PATH = Path.cwd().__str__() sys.path.insert(0, PRG_PATH) -app = FastAPI() -app.mount("/static", StaticFiles(directory="src/frontend/static"), name="static") -templates = Jinja2Templates(directory="src/frontend/templates") def RunImport(): """Begin live import of books.""" @@ -35,57 +26,15 @@ def RunImport(): return "Import Complete" -def use_route_names_as_operation_ids(app: FastAPI) -> None: - """Use route name as operation id.""" - for route in app.routes: - if isinstance(route, APIRoute): - route.operation_id = route.name - - -@app.get("/", response_class=HTMLResponse) -async def index(request: Request): - """Home page responder.""" - return templates.TemplateResponse( - "index.html", - {"request": request}) - - -@app.get("/users/me") -async def about_me(): - """About me page responder.""" - return {"user_id": "CurrentUser"} - - -@app.get("/users/{user_id}") -async def about_user(user_id: int): - """About user page responder.""" - return {"user_id": user_id} - - -@app.get("/dev/test/echo/{_test_item_}") -async def echo_test(_test_item_): - """Test echo responder function.""" - return {"Test Object": _test_item_} - - -async def fe_server(): - """Front end server entrypoint.""" - config.logger.info("Starting FastAPI server.") - fe_config = uvicorn.Config("__main__:app", port=8080, - log_level="info", reload=True) - fe_server = uvicorn.Server(fe_config) - await fe_server.serve() - - async def main(): """Program entrypoint.""" _import_thread = Thread(target=RunImport) _import_thread.start() - _task = await asyncio.create_task(fe_server()) + fe_server = FrontendServer(config) + _task = await asyncio.create_task(fe_server.run()) return [_task, _import_thread] if __name__ == "__main__": - use_route_names_as_operation_ids(app) asyncio.run(main()) sys.exit(0) diff --git a/src/frontend/lib/frontend.py b/src/frontend/lib/frontend.py new file mode 100644 index 0000000..491bd8f --- /dev/null +++ b/src/frontend/lib/frontend.py @@ -0,0 +1,58 @@ +"""pyShelf's main frontend library.""" +import uvicorn +from fastapi import FastAPI, Request +from fastapi.responses import HTMLResponse +from fastapi.routing import APIRoute +from fastapi.staticfiles import StaticFiles +from fastapi.templating import Jinja2Templates + +app = FastAPI() +templates = Jinja2Templates(directory="src/frontend/templates") +class FrontendServer(): + + def __init__(self, config): + self.config = config + app.mount("/static", StaticFiles(directory="src/frontend/static"), name="static") + + + def use_route_names_as_operation_ids(self, app: FastAPI) -> None: + """Use route name as operation id.""" + for route in app.routes: + if isinstance(route, APIRoute): + route.operation_id = route.name + + + @app.get("/", response_class=HTMLResponse) + async def index(request: Request): + """Home page responder.""" + return templates.TemplateResponse( + "index.html", + {"request": request}) + + + @app.get("/users/me") + async def about_me(): + """About me page responder.""" + return {"user_id": "CurrentUser"} + + + @app.get("/users/{user_id}") + async def about_user(user_id: int): + """About user page responder.""" + return {"user_id": user_id} + + + @app.get("/dev/test/echo/{_test_item_}") + async def echo_test(_test_item_): + """Test echo responder function.""" + return {"Test Object": _test_item_} + + + async def run(self): + """Front end server entrypoint.""" + self.config.logger.info("Starting FastAPI server.") + self.use_route_names_as_operation_ids(app) + self.fe_config = uvicorn.Config(app, port=8080, + log_level="info", reload=True) + self.fe_server = uvicorn.Server(self.fe_config) + await self.fe_server.serve() diff --git a/src/frontend/static/styles.css b/src/frontend/static/styles.css new file mode 100644 index 0000000..e69de29