有没有办法在烧瓶的调试模式下检测自动重装?

时间:2013-09-18 17:45:16

标签: python flask

我有一个烧瓶应用程序,我想在运行应用程序的第一次时执行一些代码,而不是在调试模式触发的自动重新加载。有没有办法检测何时触发重载,以便我可以这样做?

举个例子,我可能想在每次从崇高文本运行应用程序时打开一个Web浏览器,但是当我随后编辑文件时,我不想这样做:

import webbrowser
if __name__ == '__main__':
    webbrowser.open('http://localhost:5000')
    app.run(host='localhost', port=5000, debug=True)

3 个答案:

答案 0 :(得分:1)

如何在启动服务器之前使用Flask-Script启动进程?这样的事情(从他们的文档中抄写并略微编辑):

# run_devserver.py

import webbrowser
from flask.ext.script import Manager

from myapp import app

manager = Manager(app)

if __name__ == "__main__":
    webbrowser.open('http://localhost:5000')
    manager.run(host='localhost', port=5000, debug=True)

答案 1 :(得分:1)

您可以设置环境变量。

import os
if 'WERKZEUG_LOADED' in os.environ:
    print 'Reloading...'
else:
    print 'Starting...'
    os.environ['WERKZEUG_LOADED']='TRUE'

但我仍然不知道如何坚持重新加载后仍然存在的引用。

答案 2 :(得分:0)

我有一个Flask应用程序,在其中更改DEBUG标志或禁用重新加载并不现实,并且该应用程序的启动方式比flask run更为复杂。

@osa的解决方案在启用flask调试后对我不起作用,因为它没有足够的技巧从重新加载的工作进程中挑选出werkzeug watcher进程。

我的主程序包__init__.py(定义flask应用程序的程序包)中有此代码。此代码由另一个小模块运行,该模块的后跟from <the_package_name> import appapp.run(debug=True, host='0.0.0.0', port=5000)。因此,此代码是在应用启动之前执行的。

import ptvsd
import os
my_pid = os.getpid()
if os.environ.get('PPID') == str(os.getppid()):
    logger.debug('Reloading...')
    logger.debug(f"Current process ID: {my_pid}")
    try:
        port = 5678
        ptvsd.enable_attach(address=('0.0.0.0', port))
        logger.debug(f'========================== PTVSD waiting on port {port} ==========================')
        # ptvsd.wait_for_attach()   # Not necessary for my app; YMMV
    except Exception as ex:
        logger.debug(f'PTVSD raised {ex}')
else:
    logger.debug('Starting...')
    os.environ['PPID'] = str(my_pid)
    logger.debug(f"First process ID: {my_pid}")

注意:请注意os.getpid()os.getppid()之间的区别(后者获得父进程的ID)。

我可以随时随地进行附加操作,即使我在附加之前已经重新加载了应用程序,它也能很好地工作。我可以分离并重新连接。调试器在重新加载后仍然存在。