我有一个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()