前言:
描述:flask定时任务调用的方法中使用了current_app.logger.info()记录日志报错
报错代码
raise RuntimeError(unbound_message) from None
RuntimeError: Working outside of application context.This typically means that you attempted to use functionality that needed
the current application. To solve this, set up an application context
with app.app_context(). See the documentation for more information.
解决办法 :
1.创建 create.py文件
为了方便快速使用此代码,我把create.py非核心代码已注释掉,如下:
from flask import Flask, json# from utils.cache_helper import CacheHelper
# from utils.log_handler import LogHandlerdef create_app():# init appapp = Flask(__name__)# # 读取json配置# app.config.from_file("settings.json", load=json.load)# # 初始化Cache# cache = CacheHelper(app, config={'CACHE_TYPE': 'simple'})# # 添加日志配置# for log_handler in LogHandler.get_log_handlers():# app.logger.addHandler(log_handler)return app
2.定时任务调用的方法中代码如下
引入create.py文件中create_app()方法
from create import create_app
方法一
@classmethoddef my_job(cls):# 此方法在定时任务多的情况下,会有性能问题,少的情况没啥问题app = create_app()with app.app_context():current_app.logger.info("my_job已执行")print(f"my_job,当前时间{datetime.now()}")
方法二 (推荐)
添加APP全局变量
from create import create_appAPP = Nonedef get_app():global APPAPP = APP if APP is not None else create_app()
定时任务调用的方法中使用如下
提示with APP.app_context():不要写成with APP.app_context: 会报错,因为app_context是一个方法而不是一个属性,所以要写成app_context(),加上括号
@classmethoddef my_job(cls): # 使用全局APP变量get_app()with APP.app_context():current_app.logger.info("my_job已执行")print(f"my_job,当前时间{datetime.now()}")
3.执行效果
总结:
flask定时任务(APScheduler)的使用,链接如下: https://blog.csdn.net/weixin_41934979/article/details/140245835
结合上边链接,就是完整的flask 定时任务(APScheduler)使用current_app的全过程和步骤
源代码地址:https://gitee.com/jxzcode_admin/flask-project.git
参考资料:
https://blog.csdn.net/weixin_42185136/article/details/104496351?spm=1001.2014.3001.5506
https://www.jianshu.com/p/d5a46b2d2fd3