问题描述
我在 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 (将#修改为@)