From a89fd99794a32a79a8e92f696c526496dc32ac2f Mon Sep 17 00:00:00 2001 From: Ankush Menat Date: Tue, 14 Jan 2025 18:18:19 +0530 Subject: [PATCH] perf: keep jloader across requests This doesn't have anything that needs to be created for each request. --- frappe/utils/jinja.py | 44 +++++++++++++++++++++++----------------- frappe/website/router.py | 2 +- 2 files changed, 26 insertions(+), 20 deletions(-) diff --git a/frappe/utils/jinja.py b/frappe/utils/jinja.py index 6be55d7fcb..0dccfcde6a 100644 --- a/frappe/utils/jinja.py +++ b/frappe/utils/jinja.py @@ -1,5 +1,9 @@ # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors # License: MIT. See LICENSE +import frappe +from frappe.utils.caching import site_cache + + def get_jenv(): import frappe @@ -136,30 +140,32 @@ def guess_is_path(template): def get_jloader(): + jloader = _get_jloader() + frappe.local.jloader = jloader # backward compat + return jloader + + +@site_cache(ttl=10 * 60, maxsize=5) +def _get_jloader(): + from jinja2 import ChoiceLoader, PackageLoader, PrefixLoader + import frappe - if not getattr(frappe.local, "jloader", None): - from jinja2 import ChoiceLoader, PackageLoader, PrefixLoader + apps = frappe.get_hooks("template_apps") + if not apps: + apps = list(reversed(frappe.get_installed_apps(_ensure_on_bench=True))) - apps = frappe.get_hooks("template_apps") - if not apps: - apps = list( - reversed( - frappe.local.flags.web_pages_apps or frappe.get_installed_apps(_ensure_on_bench=True) - ) - ) + if "frappe" not in apps: + apps.append("frappe") - if "frappe" not in apps: - apps.append("frappe") + jloader = ChoiceLoader( + # search for something like app/templates/... + [PrefixLoader({app: PackageLoader(app, ".") for app in apps})] + # search for something like templates/... + + [PackageLoader(app, ".") for app in apps] + ) - frappe.local.jloader = ChoiceLoader( - # search for something like app/templates/... - [PrefixLoader({app: PackageLoader(app, ".") for app in apps})] - # search for something like templates/... - + [PackageLoader(app, ".") for app in apps] - ) - - return frappe.local.jloader + return jloader def set_filters(jenv): diff --git a/frappe/website/router.py b/frappe/website/router.py index ac0ecc951b..766d13fb6d 100644 --- a/frappe/website/router.py +++ b/frappe/website/router.py @@ -89,7 +89,7 @@ def get_pages(app=None): if app: apps = [app] else: - apps = frappe.local.flags.web_pages_apps or frappe.get_installed_apps() + apps = frappe.get_installed_apps() for app in apps: app_path = frappe.get_app_path(app)