[英]How Do I Pass A Parameter into A Get Request to A Flask Blueprint Python App?
[英]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.