2016-09-13 13 views
5

Tôi đang sử dụng current_app.logger và khi tôi cố gắng đăng nhập bên trong chuỗi, nó nói "làm việc bên ngoài ngữ cảnh ứng dụng". Làm thế nào để tôi đăng nhập một tin nhắn từ một phương pháp đang chạy trong một chủ đề?Sử dụng Flask current_app.logger bên trong luồng

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 - 

Trả lời

7

Bạn sử dụng logging mô-đun tiêu chuẩn trong cách tiêu chuẩn: có được logger cho các module hiện tại và đăng nhập một thông điệp với nó.

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

app.logger chủ yếu dành cho khai thác gỗ Flask nội bộ, hoặc ít nhất là khai thác gỗ trong một bối cảnh ứng dụng. Nếu bạn đang ở trong một chủ đề, bạn không còn ở trong cùng một ngữ cảnh ứng dụng nữa.

Bạn có thể vượt qua current_app._get_current_object() cho chuỗi và sử dụng thay vì current_app. Hoặc bạn có thể phân lớp Thread để làm điều tương tự.

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!' 
Các vấn đề liên quan