2016-11-21 21 views
1

我用,因此目前推出如下烧瓶中的应用程序工作:如何让“python -m flask run”运行主函数?

起始命令python -m flask run,其中FLASK_APP指向__init.py__

__init.py__简单地设置一个变量appFlask一个实例:

from .app import get_app 

app = get_app() 

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

在我看来,这瓶检测Flask集的全局实例本模块中,并运行它们,即使我无法找到任何关于这个的文档。

现在我想集成Flask-SocketIO,它需要包装烧瓶应用程序和要运行的套接字实例。 从文档,看来我应该能够从主运行:

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") 

但我从来没有看到预期的输出,并且socket服务器似乎并没有运行。对我来说,这听起来像烧瓶忽略了主要功能,仍然只是启动它发现的任何Flask实例。

为什么会发生这种情况,即是否有任何文件?或者,我在做Flask-SocketIO集成是否错误?

+0

'if __name__ ==“__main __”'只会在您执行该文件时执行,而不是从其他位置导入时执行。 'python -m flask'寻找一个名为'app'或'application'的变量或一个烧瓶对象。有没有原因,你不通过'python mymainfile.py'启动? – syntonym

+0

这对我来说很有意义。 Flask-SocketIO的文档有一个['flask run'的简短段落](http://flask-socketio.readthedocs.io/en/latest/#initialization),但我不明白它应该如何工作。启动代码是从一个非常复杂的Node脚本执行的,我没有创建它,但是我看不到'python x.py'的动机。 –

回答

2

如果您使用的是Flask 0.11和新的cli,那么运行您的应用程序所需的所有操作是flask run。 Flask-SocketIO重写了这个命令的实现,并添加了必要的魔法,使所有的工作都能正常工作。

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

+0

谢谢,那是失踪的一块!我没有看到文档中的任何地方,烧瓶运行实际上是由Flask-SocketIO改变的。另外,这也解释了为什么之前的标志('--with-threads')突然停止工作。任何机会,你碰巧知道这个国旗在哪里被记录,因为我无法找到它... –

+1

@CedricReichenbach为了使Flask-SocketIO与Flask服务器一起工作,需要强加一些限制。特别是,当Flask给你一个在常规服务器上使用'--with-threads'的选项时,当使用Flask-SocketIO时,该选项不可用。 Flask-SocketIO需要启用线程,因此该选项已被删除,线程在内部启用。 – Miguel

+0

啊,我明白了。非常感谢! –