from fastapi import FastAPI, Request from fastapi.staticfiles import StaticFiles from fastapi.responses import HTMLResponse from itables import to_html_datatable from pathlib import Path import pandas as pd ROOT = Path(".") app = FastAPI() app.mount(path="/", app=StaticFiles(directory=ROOT), name="HOME") @app.middleware("http") async def file_system(request: Request, call_next): url = request.url if url.path.endswith("/"): return HTMLResponse(content=files_in_folder(url.path.lstrip("/"))) response = await call_next(request) return response def files_in_folder(path: str): """List files to render as file index.""" folder = ROOT / path print(folder) path_glob = folder.glob("*") res = pd.DataFrame( [ ( f.name, f.stat().st_size, pd.Timestamp(int(f.stat().st_mtime), unit="s"), f.stat().st_nlink > 1, ) for f in path_glob ], columns=["path", "size", "mtime", "folder"], ).sort_values(["folder"], ascending=False) res["path"] = res.apply( lambda x: f"{x.path}", axis=1, ) return f"