4

我正在使用 Flask 构建一个 Web 应用程序。我已经对 Flask 对象进行了子类化,以便我可以在应用程序退出之前执行一段代码(Flask 对象被销毁)。当我在终端中运行它并点击 ^C 时,我没有看到“你能听到我的声音吗?” 消息,所以我认为__del__()没有被调用。

from flask import Flask

class MyFlask (Flask):

  def __init__(self, import_name, static_path=None, static_url_path=None,
                     static_folder='static', template_folder='templates',
                     instance_path=None, instance_relative_config=False):

    Flask.__init__(self, import_name, static_path, static_url_path,
                         static_folder, template_folder,
                         instance_path, instance_relative_config)

    # Do some stuff ... 

  def __del__(self):
    # Do some stuff ... 
    print 'Can you hear me?'

app = MyFlask(__name__)

@app.route("/")
def hello():
 return "Hello World!"

if __name__ == "__main__":
  app.run()

我希望这段代码在析构函数中执行,这样无论应用程序如何加载,它都会运行。即,app.run()在测试中,gunicorn hello.py在生产中。谢谢!

4

2 回答 2

6

也许这是可能的:

if __name__ == '__main__':
    init_db()  #or what you need
    try:
        app.run(host="0.0.0.0")
    finally:
        # your "destruction" code
        print 'Can you hear me?'

但是,我不知道您是否仍然可以app在 finally 块中使用...

于 2013-07-23T07:36:38.117 回答
4

不能保证__del__()为解释器退出时仍然存在的对象调用方法。此外,__del__()方法可能无法访问全局变量,因为这些变量可能已经被删除。在 Python 中依赖析构函数是个坏主意。

于 2013-07-22T22:05:12.243 回答