diff --git a/.gitignore b/.gitignore index 3a9b0a1a..820a543a 100644 --- a/.gitignore +++ b/.gitignore @@ -78,4 +78,7 @@ packages.png openflexure_microscope/cobertura.xml # labthings settings -/settings/ \ No newline at end of file +/settings/ + +# web app build +/src/openflexure_microscope_server/static/ \ No newline at end of file diff --git a/src/openflexure_microscope_server/serve_static_files.py b/src/openflexure_microscope_server/serve_static_files.py new file mode 100644 index 00000000..c6ad80f4 --- /dev/null +++ b/src/openflexure_microscope_server/serve_static_files.py @@ -0,0 +1,32 @@ +from fastapi.responses import FileResponse, RedirectResponse +from fastapi.staticfiles import StaticFiles +from fastapi import FastAPI +import os + +def add_static_file(app: FastAPI, fname: str, folder: str): + print(f"Adding route for /{fname}") + p=os.path.join(folder, fname) + app.get( + f"/{fname}", + response_class=FileResponse, + include_in_schema=False + )(lambda: FileResponse(p)) + +def add_static_files(app: FastAPI): + #with importlib.resources.as_file(openflexure_microscope_server) as p: + # static_path = p.join("/static/") + static_path = "./src/openflexure_microscope_server/static" + if not os.path.isdir(static_path): + raise RuntimeError("Can't find static files :(") + + for folder in ["css", "js", "fonts"]: + app.mount( + f"/{folder}/", + StaticFiles(directory=os.path.join(static_path, folder)), + name=f"static_{folder}", + ) + @app.get("/", response_class=RedirectResponse) + async def redirect_fastapi(): + return "/index.html" + for fname in os.listdir(static_path): + add_static_file(app, fname, static_path) diff --git a/src/openflexure_microscope_server/server.py b/src/openflexure_microscope_server/server.py index 9debde34..4b124484 100644 --- a/src/openflexure_microscope_server/server.py +++ b/src/openflexure_microscope_server/server.py @@ -1,18 +1,26 @@ from __future__ import annotations import logging +import importlib.resources +import os.path +from fastapi.staticfiles import StaticFiles +from fastapi.responses import FileResponse, RedirectResponse from labthings_fastapi.thing_server import ThingServer -from labthings_sangaboard import SangaboardThing +from labthings_sangaboard.proscan import ProScan from labthings_picamera2.thing import StreamingPiCamera2 from .things.autofocus import AutofocusThing from .things.camera_stage_mapping import CameraStageMapper +from .serve_static_files import add_static_files +import openflexure_microscope_server logging.basicConfig(level=logging.INFO) thing_server = ThingServer() thing_server.add_thing(StreamingPiCamera2(), "/camera/") -thing_server.add_thing(SangaboardThing(), "/stage/") +thing_server.add_thing(ProScan(), "/stage/") thing_server.add_thing(AutofocusThing(), "/autofocus/") thing_server.add_thing(CameraStageMapper(), "/camera_stage_mapping/") +add_static_files(thing_server.app) + app = thing_server.app \ No newline at end of file