第一次运行时烧瓶: 不要在生产环境中使用开发服务器

我在 PyCharm Community Edition 中安装了 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 时会出现这个错误?


该消息的早期版本为“不要在生产环境中使用开发服务器”

266029 次浏览

从 Flask 2.2开始,开发服务器总是显示这个警告,不可能禁用它。开发服务器不适合在生产环境中使用。它的设计目的不是特别高效、稳定或安全。使用成品 WSGI 服务器代替。有关更多信息,请参见 Flask 的部署文件

这个警告只是一个警告,并不是阻止应用程序运行的错误。如果您的应用程序不能正常工作,那么您的代码还有其他问题。

该警告应用于开发服务器,而不是 Flask 本身。Flask 框架适用于任何类型的应用程序和部署。

对于将应用程序部署到生产环境,一种选择是使用 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。

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

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

或者你可以做以下事情(我还没有试过这个,但是有一个资源在线讨论过)

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

来源: 为了更多

要避免这些消息,请在 CLI (命令行接口)中运行以下命令。

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

这对我的窗户很有效:

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

Flask _ project.py 与我的虚拟环境在同一条路径上。

试试 gevent:

from flask import Flask
from gevent.pywsgi import WSGIServer


app = Flask(__name__)


@app.route('/api', methods=['GET'])
def index():
return "Hello, World!"


if __name__ == '__main__':
# Debug/Development
# app.run(debug=True, host="0.0.0.0", port="5000")
# Production
http_server = WSGIServer(('', 5000), app)
http_server.serve_forever()

注意: 使用 pip Install gevent 安装 gevent