簡體   English   中英

如何在藍圖中獲取應用程序上下文,但不在請求中?

[英]How do I get the application context in a Blueprint, but not in a request?

我正在嘗試將Flask應用程序集合轉換為具有多個藍圖的單個應用程序。

在我的一個應用程序中,我有一個在后台定期運行的任務,與請求無關。 它看起來像這樣:

import apscheduler.schedulers.background
import flask

app = flask.Flask(__name__)
app.config['DATABASE']
scheduler = apscheduler.schedulers.background.BackgroundScheduler()
scheduler.start()

def db():
    _db = flask.g.get('_db')
    if _db is None:
        _db = get_db_connection_somehow(app.config['DATABASE'])
        flask.g._db = _db
    return _db

@scheduler.scheduled_job('interval', hours=1)
def do_a_thing():
    with app.app_context():
        db().do_a_thing()

當我將此應用程序轉換為藍圖時,我無法訪問應用程序對象,並且在我需要時無法弄清楚如何創建應用程序上下文。 這是我試過的:

import apscheduler.schedulers.background
import flask

bp = flask.Blueprint('my_blueprint', __name__)
scheduler = apscheduler.schedulers.background.BackgroundScheduler()
scheduler.start()

def db():
    _db = flask.g.get('_db')
    if _db is None:
        _db = get_db_connection_somehow(flask.current_app.config['DATABASE'])
        flask.g._db = _db
    return _db

@bp.record
def record(state):
    with state.app.app_context():
        flask.g._app = state.app

@scheduler.scheduled_job('interval', hours=1)
def do_a_thing():
    with flask.g._app.app_context():
        db().do_a_thing()

我得到的錯誤是:

RuntimeError: Working outside of application context.

那么,如何在藍圖中但在請求之外獲取應用程序上下文?

我通過以下更改解決了這個問題。 首先,我在Flask應用程序上設置了一個scheduler對象:

app = flask.Flask(__name__)
app.scheduler = apscheduler.schedulers.background.BackgroundScheduler()
app.scheduler.start()

接下來,我更改了運行后台任務的函數以接受app作為參數,因此我可以從app.config讀取數據庫連接信息:

def do_a_thing(app: flask.Flask):
    db = get_db_connection_somehow(app.config['DATABASE'])
    db.do_a_thing()

最后,我在Blueprint.record()設置了預定作業:

@bp.record
def record(state):
    state.app.scheduler.add_job(do_a_thing, trigger='interval', args=[state.app], hours=1)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM