diff options
| author | Ivan Gabaldon <igabaldon@inetol.net> | 2025-07-23 18:16:10 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-07-23 18:16:10 +0200 |
| commit | 42f102ce1bbcd76d49db0047d9ad141609eac946 (patch) | |
| tree | 18799a76d153b49701b86c99f4b9f71003c80b4c /searx/webapp.py | |
| parent | 5cbf42262189c2329fdd950b519b61dd83ae7977 (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-x | searx/webapp.py | 31 |
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() |