Skip to content

Instantly share code, notes, and snippets.

@vrslev
Last active November 3, 2024 15:35
Show Gist options
  • Save vrslev/6d0602bfa939a01844f645c608afb85a to your computer and use it in GitHub Desktop.
Save vrslev/6d0602bfa939a01844f645c608afb85a to your computer and use it in GitHub Desktop.
Automatic browser reloading in FastAPI
import os
import arel
from fastapi import FastAPI, Request
from fastapi.templating import Jinja2Templates
app = FastAPI()
templates = Jinja2Templates("templates")
if _debug := os.getenv("DEBUG"):
hot_reload = arel.HotReload(paths=[arel.Path(".")])
app.add_websocket_route("/hot-reload", route=hot_reload, name="hot-reload")
app.add_event_handler("startup", hot_reload.startup)
app.add_event_handler("shutdown", hot_reload.shutdown)
templates.env.globals["DEBUG"] = _debug
templates.env.globals["hot_reload"] = hot_reload
@app.get("/")
def index(request: Request):
return templates.TemplateResponse("index.html", context={"request": request})
# run:
# DEBUG=true uvicorn main:app --reload
fastapi
uvicorn[standard]
arel
jinja2
<body>
{% block content %}{% endblock %}
<!-- Hot reload script -->
{% if DEBUG %} {{ hot_reload.script(url_for('hot-reload')) | safe }} {% endif
%}
</body>
{% extends "base.html" %} {% block content %} Hello, world! {% endblock %}
@vrslev
Copy link
Author

vrslev commented Dec 20, 2023

It works in Safari (Version 17.2 (19617.1.17.11.9)) just fine.

@yanky2000 Just tested it in Safari 17.1—it also works. Removed the comment, thanks.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment