Browse Source

[mod] webapp.py: update engines initialization condition

Always call initialize engines except on the first run of werkzeug with the reload feature.

the reload feature is activated when:
* searx_debug is True (SEARX_DEBUG environment variable or settings.yml)
* FLASK_APP=searx/webapp.py FLASK_ENV=development flask run (see https://flask.palletsprojects.com/en/1.1.x/cli/ )

Fix SEARX_DEBUG=0 make docs
docs/admin/engines.rst : engines are initialized
See https://github.com/searx/searx/issues/2204#issuecomment-701373438
Alexandre Flament 4 years ago
parent
commit
6c39917c4d
2 changed files with 32 additions and 4 deletions
  1. 16 4
      searx/webapp.py
  2. 16 0
      searx/webutils.py

+ 16 - 4
searx/webapp.py

@@ -65,7 +65,7 @@ from searx.engines import (
 from searx.webutils import (
     UnicodeWriter, highlight_content, get_resources_directory,
     get_static_files, get_result_templates, get_themes,
-    prettify_url, new_hmac
+    prettify_url, new_hmac, is_flask_run_cmdline
 )
 from searx.webadapter import get_search_query_from_webapp, get_selected_categories
 from searx.utils import html_to_text, gen_useragent, dict_subset, match_language
@@ -114,9 +114,21 @@ app.jinja_env.lstrip_blocks = True
 app.jinja_env.add_extension('jinja2.ext.loopcontrols')
 app.secret_key = settings['server']['secret_key']
 
-if not searx_debug \
-   or os.environ.get("WERKZEUG_RUN_MAIN") == "true" \
-   or os.environ.get('UWSGI_ORIGINAL_PROC_NAME') is not None:
+# see https://flask.palletsprojects.com/en/1.1.x/cli/
+# True if "FLASK_APP=searx/webapp.py FLASK_ENV=development flask run"
+flask_run_development = \
+    os.environ.get("FLASK_APP") is not None\
+    and os.environ.get("FLASK_ENV") == 'development'\
+    and is_flask_run_cmdline()
+
+# True if reload feature is activated of werkzeug, False otherwise (including uwsgi, etc..)
+#  __name__ != "__main__" if searx.webapp is imported (make test, make docs, uwsgi...)
+# see run() at the end of this file : searx_debug activates the reload feature.
+werkzeug_reloader = flask_run_development or (searx_debug and __name__ == "__main__")
+
+# initialize the engines except on the first run of the werkzeug server.
+if not werkzeug_reloader\
+   or (werkzeug_reloader and os.environ.get("WERKZEUG_RUN_MAIN") == "true"):
     initialize_engines(settings['engines'])
 
 babel = Babel(app)

+ 16 - 0
searx/webutils.py

@@ -4,6 +4,7 @@ import csv
 import hashlib
 import hmac
 import re
+import inspect
 
 from io import StringIO
 from codecs import getincrementalencoder
@@ -125,3 +126,18 @@ def highlight_content(content, query):
                          content, flags=re.I | re.U)
 
     return content
+
+
+def is_flask_run_cmdline():
+    """Check if the application was started using "flask run" command line
+
+    Inspect the callstack.
+    See https://github.com/pallets/flask/blob/master/src/flask/__main__.py
+
+    Returns:
+        bool: True if the application was started using "flask run".
+    """
+    frames = inspect.stack()
+    if len(frames) < 2:
+        return False
+    return frames[-2].filename.endswith('flask/cli.py')