Flask 首次运行:不要在生产环境中使用开发服务器

Posted

技术标签:

【中文标题】Flask 首次运行:不要在生产环境中使用开发服务器【英文标题】:Flask at first run: Do not use the development server in a production environment 【发布时间】:2018-12-04 04:07:42 【问题描述】:

我在 PyCharm 社区版中安装了 Flask 插件,我的 Flask 应用程序中只有这个简单的代码:

from flask import Flask
app = Flask(__name__)

@app.route('/')
def index():
    return '<h1>Hello!</h1>'

if __name__ == "__main__":
    app.run(debug=True)

我收到这条消息:

WARNING: This is a development server. Do not use it in a production deployment.
Use a production WSGI server instead

* Restarting with stat
* Debugger is active!
* Debugger PIN: 123-456-789
* Running on http://127.0.0.1:5000/

为什么我在运行 Flask 时会收到此错误?


消息的先前版本为“请勿在生产环境中使用开发服务器。”

【问题讨论】:

【参考方案1】:

为了将应用程序部署到生产环境,一种选择是使用 Waitress,一个生产 WSGI 服务器。

这是在代码中使用waitress 的示例。

from flask import Flask

app = Flask(__name__)

@app.route("/")
def index():
    return "<h1>Hello!</h1>"

if __name__ == "__main__":
    from waitress import serve
    serve(app, host="0.0.0.0", port=8080)

运行应用程序:

$ python hello.py

Waitress 还提供了一个命令行实用程序waitress-serve。要使用它,您可以将代码修改为以下内容:

from flask import Flask

app = Flask(__name__)

@app.route("/")
def index():
    return "<h1>Hello!</h1>"

def create_app():
   return app

那么我们可以使用waitress-serve如下:

waitress-serve --port=8080 --call hello:create_app

顺便说一句,8080 是默认端口。

要验证部署,请打开一个单独的窗口:

% curl localhost:8080
<h1>Hello!</h1>%                     

或直接在浏览器中http://localhost:8080/。


部署应用的其他替代方案包括 Gunicorn 和 uWSGI。更多详情请参考flask deploy doc。

【讨论】:

serve(app, host="0.0.0.0", port=8080)waitress-serve --call flaskr:create_app 有什么区别。你更喜欢哪一个? 有任何根本区别。 waitress-serve 只是一个方便的命令行运行器。我个人更喜欢前者,因为它有更多的记录。 你不是要写:“那里没有任何根本区别”? 哦,我错过了最重要的词。哈哈。是的,没有任何根本区别。 “flaskr:create app”到底是什么?如果我创建了一个简单的“test.py”,其中有一个 @api.route 方法,我应该将什么作为命令行参数传递?因为显然键入与您的示例相同的内容不起作用。【参考方案2】:

除非您告诉开发服务器它正在开发模式下运行,否则它将假定您在生产中使用它并警告您不要这样做。 The development server is not intended for use in production. It is not designed to be particularly efficient, stable, or secure.

通过将FLASK_ENV 环境变量设置为development 来启用开发模式。

$ export FLASK_APP=example
$ export FLASK_ENV=development
$ flask run

如果您在 PyCharm(或任何其他 IDE)中运行,您可以在运行配置中设置环境变量。

开发模式默认启用调试器和重新加载器。如果您不想要这些,请将--no-debugger--no-reloader 传递给run 命令。


该警告只是一个警告,它并不是阻止您的应用运行的错误。如果您的应用无法运行,则说明您的代码有其他问题。

【讨论】:

【参考方案3】:

为避免出现这些消息,请在 CLI(命令行界面)中运行这些命令。

export FLASK_APP=app.py
export FLASK_ENV=development
export FLASK_DEBUG=0
flask run

【讨论】:

【参考方案4】:

如果对于某些人(比如我之前),上述答案不起作用,我认为以下答案会起作用(我认为对于 Mac 用户) 输入以下命令进行烧瓶运行

$ export FLASK_APP = hello.py
$ export FLASK_ENV = development
$ flask run

或者,您可以执行以下操作(我还没有尝试过,但是网上的一个资源谈到了它)

$ export FLASK_APP = hello.py
$ python -m flask run

来源:For more

【讨论】:

前面已经描述了同样的解决方案:***.com/a/51026060/2506522【参考方案5】:

这在 Windows 上对我有用:

$env:FLASK_APP="flask_project.py"
$env:FLASK_ENV="development"
flask run

flask_project.py 与我的虚拟环境在同一路径上。

【讨论】:

以上是关于Flask 首次运行:不要在生产环境中使用开发服务器的主要内容,如果未能解决你的问题,请参考以下文章

Flask 学习-18.配置管理开发/生产/测试环境

为啥使用 Nginx 运行 Flask 需要 WSGI 包装器?

Ubuntu+Nginx+uWSGI+Flask应用

2020最新nginx+gunicorn+supervisor部署基于flask开发的项目的生产环境的详细攻略

为了性能,请不要在CentOS中运行Docker,尽量用Ubuntu

如何在本地 Flask 环境中自动使用生产 postgres 数据库备份