5

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

举个例子,我可能想在每次从 su​​blime text 运行应用程序时打开一个 Web 浏览器,但不是在我随后编辑文件时打开一个 Web 浏览器,如下所示:

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

3 回答 3

2

您可以设置环境变量。

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

不过,我仍然不知道如何保留在重新加载后仍然存在的引用。

于 2014-10-04T22:27:12.443 回答
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)
于 2013-09-20T00:49:24.460 回答
0

我有一个 Flask 应用程序,其中更改 DEBUG 标志或禁用重新加载并不实际,并且该应用程序以比flask run.

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

我在我的主包__init__.py(定义烧瓶应用程序的包)中有这段代码。此代码由另一个小模块运行,from <the_package_name> import app其后跟app.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)。

我可以在任何时候附加并且效果很好,即使应用程序在我附加之前已经重新加载。我可以分离并重新连接。调试器在重新加载后仍然存在。

于 2019-10-25T09:45:05.917 回答