【发布时间】:2019-10-25 18:50:18
【问题描述】:
以下方式允许我启动 Flask 服务器。
选项一:
set FLASK_APP = app.py
flask run
选项 2:
set FLASK_APP = app.py
python -m flask run
选项 3:
python app.py
使用这两者有什么区别?
【问题讨论】:
以下方式允许我启动 Flask 服务器。
选项一:
set FLASK_APP = app.py
flask run
选项 2:
set FLASK_APP = app.py
python -m flask run
选项 3:
python app.py
使用这两者有什么区别?
【问题讨论】:
$ python app.py
这是调用 Python 解释器运行任何 Python 脚本的simplest, standard way。它不是特定于 Flask 的。 app.py 可能有也可能没有if __name__ == "__main__" 块(请参阅What does if __name__ == "__main__": do?),但如果您打算为 Flask 执行此操作,它 需要有调用app.run() 的__main__ 方法。来自Flask docs:
启动应用程序的另一种方法是通过 Flask.run() 方法。这将立即启动本地服务器 与烧瓶脚本完全相同。
例子:
if __name__ == '__main__': app.run()
相同的文档还说明了为什么即使这样可行,但不建议这样做:
这适用于常见情况,但不适用于 这就是为什么从 Flask 0.11 开始,
flask方法是 推荐的。原因是由于如何重新加载 机制工作有一些奇怪的副作用(比如执行 某些代码两次,有时在没有消息的情况下崩溃或在 语法或导入错误)。
如果您需要根据主机环境修改运行配置(例如端口),这种方式也会有问题。例如,在某台机器上运行时,需要使用端口 5500 而不是默认的 5000。您当然可以使用os.environ 和app.run(host=5500) 来执行此操作,但是根据与代码无关的环境相关配置来修改代码会很“麻烦”。
这就是为什么我们有第二种方式,flask command line tool。
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello, World!'
$ set FLASK_APP=app.py
$ flask run --port=5500
您现在可以将代码维护为独立于任何外部环境配置。除此之外,flask CLI 工具还有一个lot of other options for configuration and debugging,例如启用/禁用 DEBUG 模式、列出路由 (flask routes) 以及从 .env 文件中获取环境变量。
还请注意,您的应用不必显式调用app.run,而__name__ 现在不会是__main__。这对于您的应用程序只是较大包的一部分和/或需要从其他目录运行的情况很有帮助。请参阅 Flask 文档的 Larger Applications 部分。
最后,我们有第三种方式:
$ python -m flask run
这是另一个运行 Python 脚本的standard way。它也不是特定于 Flask 的。来自文档:
当使用
-m module-name调用时,给定模块位于 Python 模块路径并作为脚本执行。
这意味着将从调用的pythonmodule search path 中搜索flask。当您的环境有多个 Python 版本并且您希望确保使用正确的 Python 版本和 Flask 环境时,这特别有用。当您为多个项目安装多个 Flask 时,它也很有用。它明确设置使用哪个 Python 解释器来调用 flask CLI 工具。
$ python3.8 -m flask --version
Python 3.8.10
Flask 1.1.2
Werkzeug 1.0.1
$ python3.8 -m flask run
$ python3.7 -m flask --version
Python 3.7.4
Flask 1.1.1
Werkzeug 0.16.0
$ python3.7 -m flask run
$ python -m flask --version
Python 2.7.16
Flask 1.0.3
Werkzeug 0.14.1
$ python -m flask run
【讨论】:
flask 命令行工具被引入时,它成为运行 Flask 应用程序的推荐方法,因为它将特定于环境的配置与实际的 Web 应用程序代码(例如端口、启用调试等)分开。
flask run
这个在你的 PATH 中寻找一个可执行文件(称为flask),第一个执行带有参数run,这将使烧瓶助手通过调用 FLASK_APP 来运行应用程序。
python -m flask run
这个在你的 PATH 上寻找一个名为 python 的可执行文件,第一个执行接收 -m 作为参数,它应该运行一个模块(烧瓶),然后将参数 run 传递给它。
这里的关键区别在于,当它执行在 PATH 上找到的第一个可执行文件时,您可以运行与第一个完全不同的 Flask。你也可以运行不同python版本的Flask。
python app.py
这会调用 PATH 上的第一个 python 可执行文件,并将 app.py 作为参数传递。它将使 python 运行 app.py 脚本,该脚本可能有也可能没有 app.run()(这是启动 Flask 的原因)。
如果 app.py 中没有任何内容,它不会调用 Flask 的服务器。
【讨论】:
python -m flask app.py 来确认您正在使用的 Python 是运行 flask 的那个。