我不需要Flask应用程序中的run()方法吗?

时间:2016-11-21 03:25:31

标签: python flask

我的linode上有一个Flask应用程序设置,其目录结构如下:

|--------flask-test
|----------------app
|-----------------------static
|-----------------------templates
|-----------------------venv
|-----------------------__init__.py
|-----------------------main.py

我的__init__.py是:

# __init__.py
from flask import Flask
from main import main
app = Flask(__name__)
app.register_blueprint(main)
app.run()

main.py喜欢这样:

# main.py
from flask import Blueprint

main = Blueprint('main',__name__)
@main.route("/")
def hello():
    return "Hello World!"

@main.route("/england/")
def england():
    return "Hello England!"

如果我在本地运行应用程序,则没有问题。如果我在Web浏览器中转到我的服务器地址,则会出现内部服务器错误。但是,如果我从app.run删除该行:__init__.py,则可以正常使用。为什么是这样?为什么我不需要run方法?

2 个答案:

答案 0 :(得分:5)

你应该做

if __name__ == '__main__':
    app.run()

原因是Apache或NGINX或其他一些Web服务器直接在服务器上加载您的应用程序,但app.run()运行flask的内部Web服务器,以便您可以测试您的应用程序。

答案 1 :(得分:3)

app.run()文件中包含__init__.py有点奇怪,通常它会在您运行的单独应用程序脚本中,它将被写为:

if __name__ == '__main__':
    app.run()

这种方式app.run()仅在该脚本作为应用程序执行时被调用。

这是必要的,因为您不希望在WSGI服务器(如mod_wsgi或gunicorn)下托管时调用app.run()。使用此类WSGI服务器时,即使重用相同的脚本文件作为WSGI应用程序入口点的持有者,__name__也不会设置为__main__,而是脚本文件的基本名称。这可以确保app.run()在运行Web服务器组件的单独WSGI服务器的位置不被调用。