天天看點

Flask報錯RuntimeError: Working outside of application context.的解決

一、問題描述

我有一個這樣的需求:

我在一個forms.py子產品中建立了一個表單類,類中的一個表單域是SelectField,而它的選項(choices)是我資料庫中所有老師的清單。為了擷取這個清單,我需要每次都從資料庫中查詢一遍。

為了使我的代碼清晰,我在tools檔案夾中單獨建立了一個teacher_list子產品,在裡面寫上了查詢并擷取teacher_list的代碼,然後把teacher_list這個清單導入到forms.py中,把SelectField的choices參數設定為這個teacher_list。

我的邏輯看起來沒有問題,但是我啟動伺服器的時候,報錯了,報錯資訊如标題所示。下面還有更加詳細的描述:

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.

二、問題分析

上面的那段英文已經很明确地指出了我的問題:我要做的資料庫查詢工作需要在激活的上下文中進行,而我卻在上下文之外進行這項工作,是以報錯了。

要記得,我們可以在視圖中自由地進行資料庫查詢,是因為我們的藍圖已經被注冊到app上了,是以視圖裡的代碼一直都是在程式上下文中執行的,沒有問題。但是我們自己寫的工具包卻處于程式上下文之外,如果也想使用資料庫查詢功能,需要手動建立程式對象,并激活程式上下文。

三、代碼實作

from app.models import User
from app import create_app
import os

# 建立程式對象
app = create_app(os.environ.get('EC_CONFIG') or 'default')
# 激活程式上下文,在上下文中進行資料庫查詢
with app.app_context():
    all_teachers = User.query.filter_by(role_id=3,is_delete=False).all()
    teacher_list = [[teacher.username,teacher.name] for teacher in all_teachers]
           

如果這篇博文幫到了你,就請給我點個贊吧(#^.^#)

有疑問也歡迎留言~部落客可nice啦,線上秒回ヾ(◍°∇°◍)ノ゙