我的 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 方法?
你应该这样做
if __name__ == '__main__':
app.run()
原因是 Apache 或 NGINX 或其他一些 Web 服务器直接在服务器上加载您的应用程序,但
app.run()
运行 Flask 的内部 Web 服务器,以便您可以测试您的应用程序。
编辑: 由于有人过来并赞成这个非常古老的答案(谢谢!)我会指出没有理由包括这个约定。 Flask 包含一个用于测试的运行命令。
代替旧方法:
python yourapp.py
你现在做的是:
flask --app yourapp run
或者,如果您将应用程序的主控制器命名为“app.py”,则可以提交
--app
标志。
在
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()
。