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

问题描述 投票:0回答:2

我的 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!"

如果我在本地运行该应用程序,则没有问题。如果我在网络浏览器中访问我的服务器地址,我会收到内部服务器错误。但是,如果我删除该行:

app.run
来自
__init__.py
它工作正常。为什么是这样?为什么我不需要 run 方法?

python flask
2个回答
10
投票

你应该这样做

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

原因是 Apache 或 NGINX 或其他一些 Web 服务器直接在服务器上加载您的应用程序,但

app.run()
运行 Flask 的内部 Web 服务器,以便您可以测试您的应用程序。

编辑: 由于有人过来并赞成这个非常古老的答案(谢谢!)我会指出没有理由包括这个约定。 Flask 包含一个用于测试的运行命令。

代替旧方法:

python yourapp.py

你现在做的是:

flask --app yourapp run

或者,如果您将应用程序的主控制器命名为“app.py”,则可以提交

--app
标志。


5
投票

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

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

这样

app.run()
仅当该脚本作为应用程序执行时才会被调用。

这是必要的,因为您不希望在 WSGI 服务器(例如 mod_wsgi 或 Gunicorn)下托管时调用

app.run()
。当使用这样的 WSGI 服务器时,即使重复使用相同的脚本文件作为 WSGI 应用程序入口点的持有者,
__name__
也不会被设置为
__main__
而是脚本文件的基本名称。这可以确保在运行 Web 服务器组件的单独 WSGI 服务器上不会调用
app.run()

© www.soinside.com 2019 - 2024. All rights reserved.