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

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

我在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时为什么会出现这个错误?


之前的版本消息是“不要在生产环境中使用开发服务器。”

6个回答

284

部署应用到生产环境,其中一种选择是使用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文档


2
serve(app, host="0.0.0.0", port=8080)waitress-serve --call flaskr:create_app有什么区别?你更喜欢哪一个? - Michael
3
有一些基本的区别。waitress-serve只是一个方便的命令行运行器。个人而言,我更喜欢前者,因为它有更多的文档记录。 - Yuchen
4
你是不是本来要写:“没有任何根本性的区别”? - Michael
9
哦,我错过了最重要的词。哈哈,是的,没有任何根本性的区别。 - Yuchen
1
@ZazOufUmI 非常感谢您指出这一点。这是我上次编辑时的一个错误。我已经更正了它。应该是“def”而不是“if”。 - Yuchen
显示剩余6条评论

117

从 Flask2.2 版本开始,开发服务器总是显示这个警告,无法禁用。开发服务器不适合在生产环境中使用。它并不被设计为特别高效、稳定或安全。请使用生产 WSGI 服务器,更多信息请参见 Flask 的部署文档

尽管该警告只是一个警告,而不是阻止您的应用程序运行的错误。如果应用程序未正常工作,则代码存在其他问题。

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


12
尝试使用 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。

3
为避免这些消息,在CLI(命令行界面)中运行以下命令。
export FLASK_APP=app.py
export FLASK_ENV=development
export FLASK_DEBUG=0
flask run

2
FLASK_ENV 将被弃用。FLASK_DEBUG=0 关闭调试模式,这在开发/测试期间可能不是一个好主意。 - Kinjal Dixit

3
如果对于某些人(比如我之前)上面的答案不起作用,我认为下面的答案会起作用(对于Mac用户来说)输入以下命令来运行flask
$ export FLASK_APP=hello.py
$ export FLASK_ENV=development
$ flask run

另外,您可以尝试以下方法(我没有尝试过,但网上有一些资源谈到了这个方法)

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

source: For more


2
相同的解决方案早已被描述过:https://dev59.com/k1UK5IYBdhLWcg3w_z20#51026060 - betontalpfa

0

这对我在Windows系统上起作用:

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接