使用flask run vs python app.py vs python -m flask run有什么区别?

var*_*ble 11 python flask

以下方式允许我启动 Flask 服务器。

选项1:

set FLASK_APP = app.py
flask run
Run Code Online (Sandbox Code Playgroud)

选项 2:

set FLASK_APP = app.py
python -m flask run
Run Code Online (Sandbox Code Playgroud)

选项 3:

python app.py
Run Code Online (Sandbox Code Playgroud)

使用这两者有什么区别?

Gin*_*pin 14

$ python app.py
Run Code Online (Sandbox Code Playgroud)

这是调用 Python 解释器以运行任何 Python 脚本的最简单、标准的方法。它不是 Flask 特有的。该app.py可能会或可能不会有一个if __name__ == "__main__"块(参见如果__name__ ==“__main__”能做什么?这样做),但如果你要为瓶做到这一点,需要有__main__方法的调用app.run()。来自Flask 文档

启动应用程序的另一种方法是通过 Flask.run()方法。这将立即以与flask脚本完全相同的方式启动本地服务器。

例子:

if __name__ == '__main__':
    app.run()
Run Code Online (Sandbox Code Playgroud)

相同的文档还说明了为什么即使这样做有效,也不推荐:

这适用于常见情况,但不适用于开发,这就是为什么从 Flask 0.11 开始flask推荐使用该方法。这样做的原因是由于重新加载机制的工作方式,存在一些奇怪的副作用(例如两次执行某些代码,有时会在没有消息的情况下崩溃或在发生语法或导入错误时死亡)。

如果您需要根据主机环境修改运行配置(例如端口),这种方式也有问题。比如在某台机器上运行时需要使用5500端口而不是默认的5000。您当然可以使用os.environand 来执行此操作app.run(host=5500),但是根据与代码无关的环境相关配置修改代码将是“混乱的”。

这就是为什么我们有第二种方式,flask命令行工具

from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello, World!'
Run Code Online (Sandbox Code Playgroud)
$ set FLASK_APP=app.py 
$ flask run --port=5500
Run Code Online (Sandbox Code Playgroud)

您现在可以维护您的代码以独立于任何外部环境配置。除此之外,flaskCLI 工具还有许多其他配置和调试选项,例如启用/禁用 DEBUG 模式、列出路由 ( flask routes) 以及从 .env 文件获取 env vars。

另请注意,您的应用程序不必显式调用app.run__name__现在不会是__main__. 这对于您的应用程序只是更大包的一部分和/或需要从其他目录运行的情况很有帮助。请参阅Flask 文档的更大应用程序部分。

最后,我们有第三种方式:

$ python -m flask run
Run Code Online (Sandbox Code Playgroud)

这是运行 Python 脚本的另一种标准方式。它也不是 Flask 特有的。从文档:

使用 调用时-m module-name,给定模块位于 Python 模块路径上并作为脚本执行。

这意味着flask将从调用的python 模块搜索路径中搜索。当您的环境有多个 Python 版本并且您想确保使用正确的 Python 版本和 Flask 环境时,这尤其有用。当您为多个项目安装多个 Flask 时,它也很有用。它明确设置要使用哪个 Python 解释器来调用flaskCLI 工具。

$ python app.py
Run Code Online (Sandbox Code Playgroud)


Ale*_*tos 5

flask run
Run Code Online (Sandbox Code Playgroud)

这个在你的 PATH 上寻找一个可执行文件(称为flask),第一个执行时带有一个参数run,这将使 Flask 助手通过调用 FLASK_APP 来运行应用程序。

python -m flask run
Run Code Online (Sandbox Code Playgroud)

这个在你的 PATH 上寻找一个可执行文件python,第一个执行接收-m作为参数,它应该运行一个模块(flask),然后将参数 run 传递给它。这里的关键区别在于,当它执行 PATH 上找到的第一个可执行文件时,您可以运行与第一个完全不同的 Flask。您还可以运行不同的 python 版本的 Flask。

python app.py
Run Code Online (Sandbox Code Playgroud)

这将调用 PATH 上的第一个python可执行文件,并app.py作为参数传递。它将让 python 运行 app.py 脚本,该脚本可能有也可能没有 app.run() (这就是启动 Flask 的原因)。如果 app.py 中没有任何内容,它不会调用 Flask 的服务器。