【问题标题】:How to make "python -m flask run" run main function?如何让“python -m flask run”运行主函数?
【发布时间】:2017-04-04 17:28:32
【问题描述】:

我正在使用一个烧瓶应用程序,该应用程序当前启动如下:

启动命令为python -m flask run,其中FLASK_APP指向__init.py__

__init.py__ 只是将变量app 设置为Flask 的实例:

from .app import get_app

app = get_app()

if __name__ == "__main__":
    # do nothing
    pass

在我看来,flask 检测到此模块中设置的Flask 的全局实例并运行它们,即使我找不到任何文档。

现在我想集成 Flask-SocketIO,这需要封装烧瓶应用程序并运行套接字实例。 从文档看来,我应该可以从 main 运行它:

from .app import get_app

app, sio = get_app() # returns a Flask and a SocketIO instance now

if __name__ == "__main__":
    sio.run(app)
    print("Flask-SocketIO server launched")

但我从来没有看到预期的输出,并且套接字服务器似乎没有运行。对我来说,这听起来像是 flask 忽略了 main 函数,仍然只是启动它找到的任何 Flask 实例。

为什么会发生这种情况,即是否有相关文档?或者,我做错了 Flask-SocketIO 集成?

【问题讨论】:

  • if __name__ == "__main__" 只会在您执行该文件时执行,而不是在您从其他地方导入它时执行。 python -m flask 查找名为 appapplication 的变量或烧瓶对象。你不通过python mymainfile.py启动是有原因的吗?
  • 这对我来说很有意义。 Flask-SocketIO 的文档有一个short paragraph on flask run,但我不明白它应该如何工作。启动代码是从一个我没有创建的相当复杂的 Node 脚本执行的,但我看不到 python x.py 的动机。

标签: python flask flask-socketio


【解决方案1】:

如果您使用的是 Flask 0.11 和新的 cli,那么您只需 flask run 即可运行您的应用程序。 Flask-SocketIO 覆盖了这个命令的实现,并添加了必要的魔法来让一切正常工作。

您可以删除您的 if __name__ == '__main__' 块,除非您还希望能够使用旧的 pre-Flask 0.11 方式启动服务器。

【讨论】:

  • 谢谢,那是缺失的部分!我没有在文档中看到 flask run 实际上被 Flask-SocketIO 更改的任何地方。此外,这也解释了为什么以前的标志 (--with-threads) 突然停止工作。无论如何,您是否碰巧知道此标志的记录位置,因为我也找不到它...
  • @CedricReichenbach 要使 Flask-SocketIO 与 Flask 服务器一起工作,需要施加一些限制。特别是,虽然 Flask 为您提供了在常规服务器上使用 --with-threads 的选项,但在使用 Flask-SocketIO 时,该选项不可用。 Flask-SocketIO 需要启用线程,因此该选项被移除并在内部启用线程。
  • 啊,我明白了。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-24
  • 1970-01-01
  • 2017-11-27
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多