请问在flask后台使用多线程或用gevent时有关db和app未注册的错误

在flask后台使用多线程或用gevent向数据库批量添加数据时,出现以下错误:
“RuntimeError: application not registered on db instance and no applicationbound
to current context”
请问是什么原因造成的,如何解决呢?

缺少 flask app context

“向数据库批量添加数据”,确保 db 在flask应用上下文中。

或者你的 flask_sqlalchemy 没有进行 db.init_app(app) 什么的。

db.init_app(app)是有的,我是在shell中操作的,在shell中进行了app与db的注册:
ctx = {“db”: db}
ctx.update(current_app.make_shell_context())
如果不使用多线程是不出现上述错误的,但一使用多线程就出错了,请问是什么原因,flask是不是不允许多线程操作app?

你得把app context(或者也需要request context)复制过去,否则,两个线程是不共享context的
可以用Flask的copy_current_request_context函数:

import gevent
from flask import copy_current_request_context

# func 为某需要在后台运行的处理函数
gevent.spawn(copy_current_request_context(func), *args, **kwargs)
3 个赞