Use Flask current_app.logger dentro de los hilos.

Estoy usando current_app.logger y cuando intenté iniciar sesión dentro del hilo dice “trabajando fuera del contexto de la aplicación”. ¿Cómo registro un mensaje desde un método que se ejecuta en un hilo?

 def background(): current_app.logger.debug('logged from thread') @app.route('/') def index(): Thread(target=background).start() return 'Hello, World!' 
 Exception in thread Thread-16: Traceback (most recent call last): File "/usr/lib64/python3.5/threading.py", line 914, in _bootstrap_inner self.run() File "/usr/lib64/python3.5/threading.py", line 862, in run self._target(*self._args, **self._kwargs) File "/home/sapam/demo.py", line 57, in background current_app.logger.critical('test') File "/home/sapam/.virtualenvs/demo/lib/python3.5/site-packages/werkzeug/local.py", line 343, in __getattr__ return getattr(self._get_current_object(), name) File "/home/sapam/.virtualenvs/demo/lib/python3.5/site-packages/werkzeug/local.py", line 302, in _get_current_object return self.__local() File "/home/sapam/.virtualenvs/demo/lib/python3.5/site-packages/flask/globals.py", line 51, in _find_app raise RuntimeError(_app_ctx_err_msg) RuntimeError: Working outside of application context. This typically means that you attempted to use functionality that needed to interface with the current application object in a way. To solve this set up an application context with app.app_context(). See the documentation for more information. 127.0.0.1 - - [13/Sep/2016 12:28:24] "GET / HTTP/1.1" 200 - 

Utilice el módulo de logging estándar de la forma estándar: obtenga el registrador para el módulo actual y registre un mensaje con él.

 def background(): logging.getLogger(__name__).debug('logged from thread') 

app.logger está destinado principalmente para el registro interno de Flask, o al menos el registro dentro de un contexto de aplicación. Si estás en un hilo, ya no estás en el mismo contexto de la aplicación.

Puedes pasar current_app._get_current_object() al hilo y usar eso en lugar de current_app . O puedes subclase Thread para hacer algo similar.

 def background(app): app.logger.debug('logged from thread') @app.route('/') def index(): Thread(target=background, kwargs={'app': current_app._get_current_object()}).start() return 'Hello, World!' 
 class FlaskThread(Thread): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.app = current_app._get_current_object() def run(self): with self.app.app_context(): super().run() def background(): current_app.logger.debug('logged from thread') @app.route('/') def index(): FlaskThread(target=background).start() return 'Hello, World!' 

Lo mismo funciona para multiprocesamiento.