Fixed static files routes
This commit is contained in:
82
src/myfasthtml/myfastapp.py
Normal file
82
src/myfasthtml/myfastapp.py
Normal file
@@ -0,0 +1,82 @@
|
||||
from importlib.resources import files
|
||||
from pathlib import Path
|
||||
from typing import Optional, Any
|
||||
|
||||
import fasthtml.fastapp
|
||||
from fasthtml.components import Link, Script
|
||||
from starlette.responses import Response
|
||||
|
||||
from myfasthtml.auth.routes import setup_auth_routes
|
||||
|
||||
|
||||
def get_asset_path(filename):
|
||||
"""Get asset file path"""
|
||||
return files("myfasthtml") / "assets" / filename
|
||||
|
||||
|
||||
# Get assets directory path
|
||||
assets_path = files("myfasthtml") / "assets"
|
||||
assets_dir = Path(str(assets_path))
|
||||
|
||||
|
||||
def get_asset_content(filename):
|
||||
"""Get asset file content"""
|
||||
return get_asset_path(filename).read_text()
|
||||
|
||||
|
||||
def create_app(daisyui: Optional[bool] = False, mount_auth_app: Optional[bool] = False, **kwargs) -> Any:
|
||||
"""
|
||||
Creates and configures a FastHtml application with optional support for daisyUI themes and
|
||||
authentication routes.
|
||||
|
||||
:param daisyui: Flag to enable or disable inclusion of daisyUI-related assets for styling.
|
||||
Defaults to False.
|
||||
:type daisyui: Optional[bool]
|
||||
|
||||
:param mount_auth_app: Flag to enable or disable mounting of authentication routes.
|
||||
Defaults to False.
|
||||
:type mount_auth_app: Optional[bool]
|
||||
|
||||
:param kwargs: Arbitrary keyword arguments forwarded to the application initialization logic.
|
||||
|
||||
:return: A tuple containing the FastHtml application instance and the associated router.
|
||||
:rtype: Any
|
||||
"""
|
||||
hdrs = []
|
||||
|
||||
if daisyui:
|
||||
hdrs = [
|
||||
Link(href="/myfasthtml/daisyui-5.css", rel="stylesheet", type="text/css"),
|
||||
Link(href="/myfasthtml/daisyui-5-themes.css", rel="stylesheet", type="text/css"),
|
||||
Script(src="/myfasthtml/tailwindcss-browser@4.js"),
|
||||
]
|
||||
|
||||
app, rt = fasthtml.fastapp.fast_app(hdrs=tuple(hdrs), **kwargs)
|
||||
|
||||
# remove the global static files routes
|
||||
static_route_exts_get = app.routes.pop(0)
|
||||
|
||||
# Serve assets
|
||||
@app.get("/myfasthtml/{filename:path}.{ext:static}")
|
||||
def serve_asset(filename: str, ext: str):
|
||||
path = filename + "." + ext
|
||||
try:
|
||||
content = get_asset_content(path)
|
||||
|
||||
if filename.endswith('.css'):
|
||||
return Response(content, media_type="text/css")
|
||||
elif filename.endswith('.js'):
|
||||
return Response(content, media_type="application/javascript")
|
||||
else:
|
||||
return Response(content)
|
||||
except Exception as e:
|
||||
return Response(f"Asset not found: {path}", status_code=404)
|
||||
|
||||
# and put it back after the myfasthtml static files routes
|
||||
app.routes.append(static_route_exts_get)
|
||||
|
||||
if mount_auth_app:
|
||||
# Setup authentication routes
|
||||
setup_auth_routes(app, rt)
|
||||
|
||||
return app, rt
|
||||
Reference in New Issue
Block a user