【问题标题】:What is the difference between using flask run vs python app.py vs python -m flask run? [duplicate]使用flask run vs python app.py vs python -m flask run 有什么区别? [复制]
【发布时间】: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

使用这两者有什么区别?

【问题讨论】:

    标签: python flask


    【解决方案1】:
    $ 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.environapp.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.palletsprojects.com/en/1.1.x/quickstart/…) 没有提到使用 app.run 方法。那么通过 Flask 命令而不是 python 命令运行烧瓶应用程序是最佳实践吗?并通过命令行而不是在代码中配置主机和服务器?
    • @variable 我对这两个问题都说是。当 flask 命令行工具被引入时,它成为运行 Flask 应用程序的推荐方法,因为它将特定于环境的配置与实际的 Web 应用程序代码(例如端口、启用调试等)分开。
    【解决方案2】:
    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 的服务器。

    【讨论】:

    • 假设所有必要的代码都在 app.py 中,那么如果采用这种方法运行两者有什么技术区别?
    • 没有明显的区别(考虑到相同的环境)。但是,正如我所说,如果你在 Python 3 之前的 PATH 上安装了 Python 2,并且你想在 Python 3 上运行它,那么 Python 2 就会被调用。烧瓶也是如此,如果您在 PATH 上指向您想要的版本之前的不同烧瓶版本,它将被调用。您可以使用 python -m flask app.py 来确认您正在使用的 Python 是运行 flask 的那个。
    • 使用-m如何确认python版本?
    • 因为 python -m 的 python 部分意味着您可以明确说明要使用哪个 python。你可以编写 python -m flask run 来使用默认的 python,或者 /usr/bin/python3.6 -m flask run,或者明确地将你的系统指向你想要的 python 版本
    猜你喜欢
    • 2019-02-15
    • 1970-01-01
    • 2017-04-04
    • 2012-05-21
    • 2014-05-20
    • 1970-01-01
    • 2016-06-06
    • 1970-01-01
    • 2021-10-05
    相关资源
    最近更新 更多