summaryrefslogtreecommitdiff
path: root/searx/webapp.py
diff options
context:
space:
mode:
authorIvan Gabaldon <igabaldon@inetol.net>2025-07-23 18:16:10 +0200
committerGitHub <noreply@github.com>2025-07-23 18:16:10 +0200
commit42f102ce1bbcd76d49db0047d9ad141609eac946 (patch)
tree18799a76d153b49701b86c99f4b9f71003c80b4c /searx/webapp.py
parent5cbf42262189c2329fdd950b519b61dd83ae7977 (diff)
[enh] py: whitenoise for static handling (#5032)
While looking at ways to better handle static files, I saw a package that replaces Flask `static_folder` functionality. Not only it's considerably faster, but already includes the capability to serve sidecars without having to intercept. This also replaces the uWSGI folder mapping functionality. Closes https://github.com/searxng/searxng/issues/4977
Diffstat (limited to 'searx/webapp.py')
-rwxr-xr-xsearx/webapp.py31
1 files changed, 26 insertions, 5 deletions
diff --git a/searx/webapp.py b/searx/webapp.py
index cf7c58680..120d5de43 100755
--- a/searx/webapp.py
+++ b/searx/webapp.py
@@ -30,6 +30,9 @@ from pygments.formatters import HtmlFormatter # pylint: disable=no-name-in-modu
from werkzeug.serving import is_running_from_reloader
+from whitenoise import WhiteNoise
+from whitenoise.base import Headers
+
import flask
from flask import (
@@ -147,7 +150,7 @@ STATS_SORT_PARAMETERS = {
}
# Flask app
-app = Flask(__name__, static_folder=settings['ui']['static_path'], template_folder=templates_path)
+app = Flask(__name__, static_folder=None, template_folder=templates_path)
app.jinja_env.trim_blocks = True
app.jinja_env.lstrip_blocks = True
@@ -245,6 +248,7 @@ def custom_url_for(endpoint: str, **values):
if not _STATIC_FILES:
_STATIC_FILES = webutils.get_static_file_list()
+ # handled by WhiteNoise
if endpoint == "static" and values.get("filename"):
# We need to verify the "filename" argument: in the jinja templates
@@ -257,9 +261,11 @@ def custom_url_for(endpoint: str, **values):
if arg_filename not in _STATIC_FILES:
# try file in the current theme
theme_name = sxng_request.preferences.get_value("theme")
- arg_filename = f"themes/{theme_name}/{arg_filename}"
- if arg_filename in _STATIC_FILES:
- values["filename"] = arg_filename
+ theme_filename = f"themes/{theme_name}/{arg_filename}"
+ if theme_filename in _STATIC_FILES:
+ values["filename"] = theme_filename
+
+ return f"/static/{values['filename']}"
if endpoint == "info" and "locale" not in values:
@@ -1424,7 +1430,22 @@ def init():
favicons.init()
-application = app
+def static_headers(headers: Headers, _path: str, _url: str) -> None:
+ headers['Cache-Control'] = 'public, max-age=30, stale-while-revalidate=60'
+
+ for header, value in settings['server']['default_http_headers'].items():
+ headers[header] = value
+
+
+app.wsgi_app = WhiteNoise(
+ app.wsgi_app,
+ root=settings['ui']['static_path'],
+ prefix="static",
+ max_age=None,
+ allow_all_origins=False,
+ add_headers_function=static_headers,
+)
+
patch_application(app)
init()