From c94c0591c338f41df97a7020e754777ea464b948 Mon Sep 17 00:00:00 2001 From: Ankush Menat Date: Sun, 4 Jun 2023 12:47:09 +0530 Subject: [PATCH] perf: cache dynamic web pages --- frappe/website/doctype/web_page/web_page.py | 16 +++++++++++----- frappe/website/page_renderers/document_page.py | 3 +++ frappe/website/router.py | 7 +++---- 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/frappe/website/doctype/web_page/web_page.py b/frappe/website/doctype/web_page/web_page.py index 9a16654085..2f89252626 100644 --- a/frappe/website/doctype/web_page/web_page.py +++ b/frappe/website/doctype/web_page/web_page.py @@ -8,6 +8,7 @@ from jinja2.exceptions import TemplateSyntaxError import frappe from frappe import _ from frappe.utils import get_datetime, now, quoted, strip_html +from frappe.utils.caching import redis_cache from frappe.utils.jinja import render_template from frappe.utils.safe_exec import safe_exec from frappe.website.doctype.website_slideshow.website_slideshow import get_slideshow @@ -30,11 +31,9 @@ class WebPage(WebsiteGenerator): if not self.dynamic_route: self.route = quoted(self.route) - def on_update(self): - super().on_update() - - def on_trash(self): - super().on_trash() + def clear_cache(self): + super().clear_cache() + get_dynamic_web_pages.clear_cache() def get_context(self, context): context.main_section = get_html_content_based_on_type(self, "main_section", self.content_type) @@ -247,3 +246,10 @@ def extract_script_and_style_tags(html): style.extract() return str(soup), scripts, styles + + +@redis_cache(ttl=60 * 60) +def get_dynamic_web_pages() -> dict[str, str]: + return frappe.get_all( + "Web Page", fields=["name", "route", "modified"], filters=dict(published=1, dynamic_route=1) + ) diff --git a/frappe/website/page_renderers/document_page.py b/frappe/website/page_renderers/document_page.py index 1d8ce82317..6c760fa0b0 100644 --- a/frappe/website/page_renderers/document_page.py +++ b/frappe/website/page_renderers/document_page.py @@ -103,4 +103,7 @@ def _find_matching_document_webview(route: str) -> tuple[str, str] | None: def clear_routing_cache(): + from frappe.website.doctype.web_page.web_page import get_dynamic_web_pages + _find_matching_document_webview.clear_cache() + get_dynamic_web_pages.clear_cache() diff --git a/frappe/website/router.py b/frappe/website/router.py index 655fcc1357..4493d437b8 100644 --- a/frappe/website/router.py +++ b/frappe/website/router.py @@ -16,12 +16,11 @@ def get_page_info_from_web_page_with_dynamic_routes(path): """ Query Web Page with dynamic_route = 1 and evaluate if any of the routes match """ + from frappe.website.doctype.web_page.web_page import get_dynamic_web_pages + rules, page_info = [], {} - # build rules from all web page with `dynamic_route = 1` - for d in frappe.get_all( - "Web Page", fields=["name", "route", "modified"], filters=dict(published=1, dynamic_route=1) - ): + for d in get_dynamic_web_pages(): rules.append(Rule("/" + d.route, endpoint=d.name)) d.doctype = "Web Page" page_info[d.name] = d