如何在flask应用程序中使用记录器来处理外部应用程序上下文flask-apscheduler

问题描述

我在 flask-apscheduler 应用程序中使用 Flask
我正在尝试从由 flask-apscheduler 模块触发的函数中记录日志。但我收到错误 RuntimeError: Working outside of application context.
我有一个简单的应用程序,其中包含,

app.py


from flask import Flask

from . import apscheduler
from . import config
from . import logging
from . import scheduler


def create_app(*args,**kwargs):
    app = Flask(__name__)
    app.app_context()
    # Setup configurations
    app.config.from_mapping(config.fetch())
    app.config.from_mapping(**kwargs)
    logging.setup(app)
    
    # Flask-APScheduler
    apscheduler.setup(app)

    blueprints = [
        scheduler.app,]

    url_prefix = app.config.get("ROUTE_PREFIX","")
    for blueprint in blueprints:
        app.register_blueprint(blueprint,url_prefix=url_prefix + blueprint.url_prefix)

    return app

logging.py 支持日志记录。


import logging

from flask import Flask

def setup(app: Flask) -> None:
   logging.basicConfig(filename='app.log',level=logging.DEBUG,format=f'%(asctime)s %(levelname)s %(name)s %(threadName)s : %(message)s')

scheduler.py 是接收 API 请求的端点。


from flask import Blueprint,request,jsonify,current_app

app = Blueprint("schedule",__name__,url_prefix="/schedule")


@app.post("/add")
def add_schedule():
    res = request.json
    try:
        # Add job in the job store of apscheduler
        current_app.apscheduler.add_job(
            func=my_func,id=str(res.get('id')),trigger="cron",replace_existing=False,day=res.get('day'),hour=res.get('hour'),minute=res.get('min'),)
        current_app.logger.info(f'schedule added')
        return jsonify({'Success':'ok'}),201

    except Exception as e:
        current_app.logger.exception(f'exception occurred')
        raise


def my_func():
    ##### This logger gets traceback.######
    current_app.logger.info("my_func called")
    print("my_func called")

apscheduler.py 这会将flask-apscheduler 库初始化为后台


from flask import Flask

from apscheduler.schedulers.background import BackgroundScheduler
from flask_apscheduler import APScheduler


def setup(app: Flask) -> None:
    scheduler_obj = BackgroundScheduler(
        jobstores=app.config.get("JOBSTORES"),executors=app.config.get("EXECUTORS"),job_defaults=app.config.get("JOB_DEFAULTS"),timezone=app.config.get("TIMEZONE","utc"),daemon=True,)
    apscheduler = APScheduler(scheduler_obj)
    apscheduler.init_app(app)
    apscheduler.start()


当flask-apscheduler 触发函数my_func 时,我收到以下错误

Traceback (most recent call last):
  File "c:\users\flask-t0w6nrnw\lib\site-packages\apscheduler\executors\base.py",line 125,in run_job
    retval = job.func(*job.args,**job.kwargs)
  File "C:\Users\sample-Flask\api\scheduler.py",line 29,in my_func
    current_app.logger.info("my_func called")
  File "c:\users\flask-t0w6nrnw\lib\site-packages\werkzeug\local.py",line 422,in __get__
    obj = instance._get_current_object()
  File "c:\users\flask-t0w6nrnw\lib\site-packages\werkzeug\local.py",line 544,in _get_current_object
    return self.__local()  # type: ignore
  File "c:\users\flask-t0w6nrnw\lib\site-packages\flask\globals.py",line 47,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 some way. To solve
this,set up an application context with app.app_context().  See the
documentation for more information.

有人可以向我建议如何在烧瓶应用程序上下文之外使用的函数中使用记录器吗?
就我而言,my_func 在应用上下文之外被调用

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...