初次运行时的烧瓶:请勿在生产环境中使用开发服务器


76

我在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时出现此错误?


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

Answers:


59

除非您告知开发服务器它正在开发模式下运行,否则它将假定您正在生产环境中使用它,并警告您不要这样做。开发服务器不适用于生产环境。它的设计目的不是特别高效,稳定或安全。

通过设置 FLASK_ENV环境变量来development

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

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

开发模式默认情况下启用调试器和重新加载器。如果您不想要这些,通过--no-debugger--no-reloaderrun命令。


但是,该警告只是警告,并不是阻止您的应用运行的错误。如果您的应用无法正常运行,则您的代码还有其他问题。


94

官方教程讨论了将应用程序部署到生产环境。一种选择是使用Waitress(生产WSGI服务器)。其他服务器包括Gunicorn和uWSGI。

在公开运行而不是在开发中运行时,请勿使用内置的开发服务器(flask run)。为了方便起见,Werkzeug提供了开发服务器,但该服务器并非特别高效,稳定或安全。

而是使用生产WSGI服务器。例如,要使用侍应生,首先将其安装在虚拟环境中:

$ pip install waitress

您需要告诉Waitress您的应用程序,但是它 FLASK_APP不像flask run那样使用。您需要告诉它导入并调用应用程序工厂以获取应用程序对象。

$ waitress-serve --call 'flaskr:create_app'
Serving on http://0.0.0.0:8080

或者,您可以waitress.serve()在代码中使用而不是使用CLI命令。

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

有什么区别serve(app, host="0.0.0.0", port=8080)waitress-serve --call flaskr:create_app。你更倾向哪个?
Michael Lossagk

1
有根本的区别。waitress-serve只是一个方便的命令行运行程序。我个人更喜欢前者,因为它有更多的文献资料。
Yuchen Zhong

您是否要写:“没有根本的区别”?
Michael Lossagk

哦,我错过了最重要的词。大声笑。是的,没有任何根本差异。
Yuchen Zhong

0

如果对于某些人(如我之前所述)不起作用,我认为以下答案将起作用(对于我认为的Mac用户)输入以下命令以执行flask运行

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

或者,您可以执行以下操作(我还没有尝试过,但是在线上有一篇资源对此进行了讨论)

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

来源:更多


1
前面已经描述了相同的解决方案:stackoverflow.com/a/51026060/2506522
betontalpfa

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.