fetch_fragment() auto-returns "" when called inside a fragment request
(detected via X-Fragment-Request header). This prevents deadlocks when
e.g. blog fetches cart-mini from cart, and cart's context processor
fetches nav-tree from blog.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
FragmentError raised on network errors or non-200 responses when
required=True (default). Logs at ERROR level. Pass required=False
for optional fragments that should degrade gracefully.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
New HTTP client (fragments.py) fetches HTML fragments from other apps
over the Docker network, with Redis caching and graceful degradation.
Jinja global `fragment()` available in all templates.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>