前言:
描述: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?