我有一个烧瓶应用程序,我想在运行应用程序的第一次时执行一些代码,而不是在调试模式触发的自动重新加载。有没有办法检测何时触发重载,以便我可以这样做?
举个例子,我可能想在每次从崇高文本运行应用程序时打开一个Web浏览器,但是当我随后编辑文件时,我不想这样做:
import webbrowser
if __name__ == '__main__':
webbrowser.open('http://localhost:5000')
app.run(host='localhost', port=5000, debug=True)
答案 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 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)。
我可以随时随地进行附加操作,即使我在附加之前已经重新加载了应用程序,它也能很好地工作。我可以分离并重新连接。调试器在重新加载后仍然存在。