Python Flask/Werkzeug调试器、流程模型和初始化代码

Python Flask/Werkzeug调试器、流程模型和初始化代码,python,flask,wsgi,werkzeug,Python,Flask,Wsgi,Werkzeug,我正在使用Flask编写一个Python web应用程序。我的应用程序在启动时与另一台服务器建立连接,并在后台定期与该服务器通信 如果我不使用Flask的内置调试器(使用debug=False调用app.run),就没有问题 如果我确实使用内置调试器(使用debug=True调用app.run),Flask将使用相同的代码启动第二个Python进程。它的子进程最终监听HTTP连接,并且通常按照我的应用程序的预期运行,我认为当调试器启动时,父进程只是在那里监视它 然而,这对我在两个进程中运行的启动

我正在使用Flask编写一个Python web应用程序。我的应用程序在启动时与另一台服务器建立连接,并在后台定期与该服务器通信

如果我不使用Flask的内置调试器(使用debug=False调用app.run),就没有问题

如果我确实使用内置调试器(使用debug=True调用app.run),Flask将使用相同的代码启动第二个Python进程。它的子进程最终监听HTTP连接,并且通常按照我的应用程序的预期运行,我认为当调试器启动时,父进程只是在那里监视它

然而,这对我在两个进程中运行的启动代码造成了严重破坏;最后,我有两个到外部服务器的连接,两个进程记录到同一个日志文件,通常,它们会互相绊倒

我假设在调用app.run()之前我不应该做真正的工作,但是我应该把这个初始化代码放在哪里(我只希望每个Flask进程组运行一次,不管调试器模式如何,但它需要在启动时运行,并且独立于客户端请求)


我发现这有点相关,但有点不同,答案对我没有帮助。(我也有一个单独的长时间运行的线程,标记为守护进程线程,但当重新加载程序启动时它会被终止,但我试图解决的问题是在需要进行任何重新加载之前。我不关心重新加载;我关心的是额外的进程,以及避免在父进程中执行不必要代码的正确方法。)

我确认这种行为是由于Werkzeug引起的,而不是烧瓶本身,它与重新装载机有关。您可以在Werkzeug的service.py中看到这一点——在run_simple()中,如果use_reloader为true,它将通过一个助手函数run_with_reloader()/restart_with_reloader()调用make_服务器,该函数在环境中设置环境变量Werkzeug_run_MAIN后执行subprocess.call(sys.executable)

我用一个相当难看的方法解决了这个问题:在我的main函数中,在创建wsgi应用程序对象并调用app.run()之前,我寻找WERKZEUG_run_main:

if use_reloader and not os.environ.get('WERKZEUG_RUN_MAIN'):
    logger.warning('startup: pid %d is the werkzeug reloader' % os.getpid())
else:
    logger.warning('startup: pid %d is the active werkzeug' % os.getpid()
    # my real init code is invoked from here
我有一种感觉,如果在Werkzeug开始服务之前调用了一个方法,那么从应用程序对象内部执行该操作会更好。不过,我不知道有这样的方法


这一切归结为:在Werkzeug的run_simple.py中,最终只有一个调用make_server().serve_forever(),但在我们创建make_server()之前,可能会有两个调用run_simple()(以及到那时为止的整个调用堆栈)。

谢谢这个问题(和答案),当我尝试做类似的事情时,这个问题让我感到困惑。我想这个答案可能已经过时了。烧瓶现在有了一个装饰师。