2013-07-22 2 views
4

Я создаю веб-приложение, используя Flask. Я подклассифицировал объект Flask, чтобы я мог выполнить кусок кода до того, как приложение выйдет (объект Flask get будет уничтожен). Когда я запускаю это в своем терминале и нажимаю^C, я не вижу «Вы меня слышите?» сообщение, поэтому я предполагаю, что __del__() не вызван.Fluster destructor

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 в производстве. Благодаря!

+3

Вы должны, вероятно, использовать [сигналы] (HTTP://docs.python.org/2/library/signal.html) в вашем скрипте, чтобы поймать окончание программы. – korylprince

+0

Хорошая идея. Достаточно легко поймать SIGINT, но мне нужно провести некоторое исследование того, какие сигналы будут использоваться при развертывании кода. Это будет сделано на Героку. – tweaksp

ответ

4

It is not guaranteed that __del__() methods are called for objects that still exist when the interpreter exits. Кроме того, методы __del__() могут не иметь доступа к глобальным переменным, поскольку они уже могут быть удалены. Опираясь на деструкторы в Python - это плохая идея.

+0

Код будет ссылаться только на сам экземпляр, а не на глобальные. – tweaksp

+0

@ Крис: Он называет 'Flask .__ del__'. «Flask» - глобальный. – user2357112

+0

Да, я вижу. Но если это было опущено, как могло случиться, что деструктор не вызван? Что-то еще ссылается на «приложение» до последней секунды? – tweaksp

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 в конце концов блок ...

+1

Это лучшее решение, и да, вы все еще можете полностью использовать объект приложения в блоке finally. –