我的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方法?
答案 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服务器的位置不被调用。