generated from hjess/PythonTemplateProject
All checks were successful
Build, Push, and Deploy to Nomad / docker-nomad (push) Successful in 39s
65 lines
2.6 KiB
Python
65 lines
2.6 KiB
Python
import os
|
|
import json
|
|
from fastapi import APIRouter, Request
|
|
from fastapi.responses import HTMLResponse, Response
|
|
from fastapi.templating import Jinja2Templates
|
|
|
|
class DynamicController:
|
|
def __init__(self, data_dir: str):
|
|
"""Initialize the dynamic controller."""
|
|
self.router = APIRouter()
|
|
self.templates = Jinja2Templates(directory="templates")
|
|
self.data_dir = data_dir
|
|
self.data = self._load_mock_data()
|
|
self._add_dynamic_routes()
|
|
|
|
def _load_mock_data(self):
|
|
"""Load mock data from a JSON file."""
|
|
with open("generated_data.json") as file:
|
|
return json.load(file)
|
|
|
|
def _add_dynamic_routes(self):
|
|
"""Scan data directory and create dynamic routes."""
|
|
for root, dirs, files in os.walk(self.data_dir):
|
|
for directory in dirs:
|
|
route_path = f"/{directory}" # Create route based on directory name
|
|
directory_path = os.path.join(root, directory)
|
|
|
|
# Register route dynamically
|
|
self.router.add_api_route(
|
|
route_path,
|
|
self._serve_dynamic_template(directory, directory_path),
|
|
methods=["GET"],
|
|
response_class=HTMLResponse,
|
|
)
|
|
|
|
def _serve_dynamic_template(self, route_name: str, directory_path: str):
|
|
"""Closure to serve templates for each route."""
|
|
|
|
async def route_handler(request: Request):
|
|
# Look for index.html or render fallback content
|
|
index_html = os.path.join(directory_path, "index.html")
|
|
if os.path.exists(index_html):
|
|
with open(index_html, "r", encoding="utf-8") as file:
|
|
content = file.read()
|
|
# Find the author for this route from preloaded data
|
|
for category in self.data.get("categories", []):
|
|
if category["path"] == route_name:
|
|
author_name = category["author"]
|
|
break
|
|
# Pass required data to the template
|
|
return self.templates.TemplateResponse(
|
|
"category.html",
|
|
{
|
|
"request": request,
|
|
"page_title": route_name.capitalize(),
|
|
"content": content,
|
|
"author": author_name,
|
|
"data": self.data, # Pass additional data if needed
|
|
},
|
|
)
|
|
|
|
# Fallback: Return a 404 if no content is found
|
|
return Response(f"No content found for {route_name}", status_code=404)
|
|
return route_handler
|