瓶.应用程序上下文和对数据库的访问.会话一个新线程.应用程序没有在数据库实例上注册,也没有应用程序绑定到当前上下文



我有一个Flask + sqlalchemy的应用程序。我需要延迟从数据库中删除对象。为此,我编写了一个带有计时器的类。

from threading import Timer
from ..extensions import db
# db = SQLAlchemy()
class Remover(object):
    """docstring for Remover"""
    def __init__(self, obj):
        super(Remover, self).__init__()
        self.obj = obj
        self.t = Timer(10, self.remove)
        self.t.start()
    def remove(self):
        try:
            db.session.delete(self.obj)
            db.session.commit()
        except Exception, e:
            raise e
    def cancel(self):
        self.t.cancel()
u = User().query.first()
Remover(u)

但是定时器在一个新线程中启动。也许这就是为什么我得到一个异常:

Exception in thread Thread-2:
Traceback (most recent call last):
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py", line 808, in __bootstrap_inner
    self.run()
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py", line 1080, in run
    self.function(*self.args, **self.kwargs)
  File "/Users/egregors/pythonProject/RSys/rSystem/admin/views.py", line 638, in remove
    raise e
RuntimeError: application not registered on db instance and no
application bound to current context

有人知道你如何正确实现这样一个类吗?如何处理线程和应用程序上下文?

谢谢

请阅读http://flask.pocoo.org/docs/0.10/appcontext/,然后尝试:

with app.app_context():
    db.session.delete(self.obj)
    db.session.commit()

最新更新