Python Flask "set up an application context with app.app_context()"问题
HDUZN

Flask更新到新版本后,现在我用的是 Flask2.2.2,会报这个错:

1
2
3
4
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.

以前用的旧版本没碰到这个问题。

这是我第2次碰到这个问题了。

第1次 数据库初始化的时候

第1次是数据库初始化的时候,原来在main函数中是这样写的,就报了这个错。

1
2
3
4
5
6
7
8
if __name__ == '__main__':
# 数据库初始化
# 删除表
db.drop_all()
# 创建表
db.create_all()

app.run('0.0.0.0', port=5000) # 这句会报提醒,测试用问题不大

解决方法:

改成下面这样就行了,加了句with app.app_context()

1
2
3
4
5
6
7
8
9
if __name__ == '__main__':
# 数据库初始化
with app.app_context():
# 删除表
db.drop_all()
# 创建表
db.create_all()

app.run('0.0.0.0', port=5000) # 这句会报提醒,测试用问题不大

关于app.run()这句的提醒,想解决看这篇文章:Python Flask使用WSGI server

第2次 数据库插入数据的时候

用flask_sqlalchemy,进行数据库插入的时候,也报了这个错。

原来是这么写的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# ...省略
class Record(db.Model):
id = db.Column(db.Integer, primary_key=True)
device_id = db.Column(db.String(80), unique=False, nullable=False)
temperature = db.Column(db.Float, nullable=False)
humidity = db.Column(db.Float, nullable=False)
pressure = db.Column(db.Float, nullable=False)

def __init__(self, device_id, temperature, humidity, pressure):
self.device_id = device_id
self.temperature = temperature
self.humidity = humidity
self.pressure = pressure

# 处理订阅到的消息,存入数据库
@mqtt_client.on_message()
def handle_mqtt_message(client, userdata, message):
global user_data # user_data 是dict字典类型
# ...省略
# 写入数据库,然后就这里报错了
record = Record(**user_data)
print(record)

try:
db.session.add(record)
db.session.commit()
except Exception as e:
db.session.rollback()
print(e)
# ...省略

改成下面这样,其实也是一样的,涉及到数据库写入的时候,套上with app.app_context()就行:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# ...省略
# 处理订阅到的消息,存入数据库
@mqtt_client.on_message()
def handle_mqtt_message(client, userdata, message):
global user_data
# ...省略
# 写入数据库
with app.app_context():
record = Record(**user_data)
print(record)

try:
db.session.add(record)
db.session.commit()
except Exception as e:
db.session.rollback()
print(e)
  • 本文标题:Python Flask "set up an application context with app.app_context()"问题
  • 本文作者:HDUZN
  • 创建时间:2023-02-12 13:59:10
  • 本文链接:http://hduzn.cn/2023/02/12/Python-Flask-set-up-an-application-context-with-app-app-context-问题/
  • 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
 评论