Cache url path lookup

I've seen py-spy dumps where usegalaxy.org was busy looking up routes.
This is an easy win. Claude claims 87X speedup in a synthetic benchmark:
https://gist.github.com/mvdbeek/a257c8885edba9e02482b598076eaa0e
This commit is contained in:
mvdbeek
2026-03-20 15:22:15 +01:00
parent dd290a7c36
commit f1dfa2c67a
+16 -1
View File
@@ -211,6 +211,7 @@ def get_required_user(
class UrlBuilder:
def __init__(self, request: Request):
self.request = request
self._route_cache: dict[str, Any] = {}
def __call__(self, name: str, **path_params):
qualified = path_params.pop("qualified", False)
@@ -223,7 +224,7 @@ class UrlBuilder:
else:
url = str(self.request.url_for(name, **path_params))
else:
url = self.request.app.url_path_for(name, **path_params)
url = self._url_path_for_cached(name, **path_params)
if query_params:
url = f"{url}?{urlencode(query_params)}"
return url
@@ -233,6 +234,20 @@ class UrlBuilder:
path_params.update(query_params)
return web.url_for(name, **path_params)
def _url_path_for_cached(self, name: str, **path_params) -> str:
"""Cached version of app.url_path_for that avoids repeated linear route scans."""
cached_route = self._route_cache.get(name)
if cached_route is not None:
return cached_route.url_path_for(name, **path_params)
for route in self.request.app.routes:
try:
url = route.url_path_for(name, **path_params)
self._route_cache[name] = route
return url
except NoMatchFound:
pass
raise NoMatchFound(name, path_params)
class GalaxyASGIRequest(GalaxyAbstractRequest):
"""Wrapper around Starlette/FastAPI Request object.