Browser hot reload for Python ASGI web apps
Project description
arel
Browser hot reload for Python ASGI web apps.
Overview
What is this for?
arel
can be used to implement development-only hot-reload for non-Python files that are not read from disk on each request. This may include HTML templates, GraphQL schemas, cached rendered Markdown content, etc.
How does it work?
arel
watches changes over a set of files. When a file changes, arel
notifies the browser (using WebSocket), and an injected client script triggers a page reload. You can register your own reload hooks for any extra server-side operations, such as reloading cached content or re-initializing other server-side resources.
Installation
pip install 'arel==0.3.*'
Quickstart
For a working example using Starlette, see the Example section.
Although the exact instructions to set up hot reload with arel
depend on the specifics of your ASGI framework, there are three general steps to follow:
-
Create an
HotReload
instance, passing one or more directories of files to watch, and optionally a list of callbacks to call before a reload is triggered:import arel async def reload_data(): print("Reloading server data...") hotreload = arel.HotReload( paths=[ arel.Path("./server/data", on_reload=[reload_data]), arel.Path("./server/static"), ], )
-
Mount the hot reload endpoint, and register its startup and shutdown event handlers. If using Starlette, this can be done like this:
from starlette.applications import Starlette from starlette.routing import WebSocketRoute app = Starlette( routes=[WebSocketRoute("/hot-reload", hotreload, name="hot-reload")], on_startup=[hotreload.startup], on_shutdown=[hotreload.shutdown], )
-
Add the JavaScript code to your website HTML. If using Starlette with Jinja templates, you can do this by updating the global environment, then injecting the script into your base template:
templates.env.globals["DEBUG"] = os.getenv("DEBUG") # Development flag. templates.env.globals["hotreload"] = hotreload
<body> <!-- Page content... --> <!-- Hot reload script --> {% if DEBUG %} {{ hotreload.script(url_for('hot-reload')) | safe }} {% endif %} </body>
Example
The example
directory contains an example Markdown-powered website that uses arel
to refresh the browser when Markdown content or HTML templates change.
License
MIT
Changelog
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog.
0.3.0 - 2023-12-29
Changed
- Use
watchfiles
instead ofwatchgod
. This unlocks Python 3.12 support. (Pull #34)
Added
- Add support for Python 3.12. (Pull #35)
0.2.0 - 2020-07-08
Added
- Add support for watching multiple directories, each with its own reload callbacks. (Pull #15)
Changed
arel.HotReload("./directory", on_reload=[...])
should now be written asarel.HotReload(paths=[arel.Path("./directory", on_reload=[...])])
. (Pull #15)
0.1.0 - 2020-04-11
Initial release.
Added
- Add
HotReload
ASGI application class. (Pull #1)
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file arel-0.3.0.tar.gz
.
File metadata
- Download URL: arel-0.3.0.tar.gz
- Upload date:
- Size: 13.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.2 CPython/3.12.1
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | c424710c6abfafedadf1ee275ffd049d0e8840bfeb2bdcdbbde762e7eb448011 |
|
MD5 | 9f9db562f13e6125f58e1fc9f01d215f |
|
BLAKE2b-256 | 9312f806493dc5e44a0e555e6c58ed6655379cfd2368f19b3126fab76f79ab22 |
File details
Details for the file arel-0.3.0-py3-none-any.whl
.
File metadata
- Download URL: arel-0.3.0-py3-none-any.whl
- Upload date:
- Size: 8.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.2 CPython/3.12.1
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 0edca29af00dc0610d0ac7880bcc48464ac551f7228724f1191035445854996a |
|
MD5 | 597c9bcafa86c3f07e7e06051784cfda |
|
BLAKE2b-256 | 41d90569f4c5218b815fbe3ba0254225127d08483706096f470084b22efca37e |