天天看点

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啦,在线秒回ヾ(◍°∇°◍)ノ゙