首次运行 Flask:不要在生产环境中使用开发服务器
- 2025-03-04 08:27:00
- admin 原创
- 82
问题描述:
我在 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:
要将应用程序部署到生产环境,一种选择是使用生产 WSGI 服务器 Waitress。
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 部署文档。
解决方案 2:
从 Flask 2.2 开始,开发服务器始终显示此警告,无法禁用它。开发服务器不适用于生产环境。它不是特别高效、稳定或安全。请使用生产 WSGI 服务器。有关更多信息,请参阅Flask 的部署文档。
不过,这个警告只是一个警告,并不是阻止您的应用运行的错误。如果您的应用无法运行,则您的代码存在其他问题。
该警告适用于开发服务器,而不适用于 Flask 本身。Flask 框架适用于任何类型的应用程序和部署。
解决方案 3:
尝试 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
解决方案 4:
如果对于某些人(比如我之前)上述答案不起作用,我认为以下答案会起作用(我认为对于 Mac 用户来说)输入以下命令来执行 flask run
$ export FLASK_APP=hello.py
$ export FLASK_ENV=development
$ flask run
或者,您可以执行以下操作(我还没有尝试过,但网上有一个资源谈到了这一点)
$ export FLASK_APP=hello.py
$ python -m flask run
来源:更多
解决方案 5:
为了避免这些消息,请在 CLI(命令行界面)内运行这些命令。
export FLASK_APP=app.py
export FLASK_ENV=development
export FLASK_DEBUG=0
flask run
解决方案 6:
要绕过警告,请使用以下代码,否则请按照以下步骤操作:https://flask.palletsprojects.com/en/2.3.x/deploying/
import functools
from typing import Callable, Any, Tuple, Dict
import werkzeug.serving
def _ansi_style_supressor(func: Callable[..., Any]) -> Callable[..., Any]:
@functools.wraps(func)
def wrapper(*args: Tuple[Any, ...], **kwargs: Dict[str, Any]) -> Any:
if args and isinstance(args[0], str) and args[0].startswith('WARNING: This is a development server.'):
return ''
return func(*args, **kwargs)
return wrapper
# Apply the suppressor to the _ansi_style function
werkzeug.serving._ansi_style = _ansi_style_supressor(werkzeug.serving._ansi_style)
将上述代码粘贴到运行 Flask 的文件顶部。
上面的代码定义了一个装饰器 _ansi_style_supressor,它以一个函数作为输入,并返回一个仅抑制警告消息的修改后的函数。
解决方案 7:
这个答案专门针对在 Flask 后端运行 Dash 应用程序
在使用 Flask 开发 Dash 应用时,此警告很常见。您可以在开发过程中忽略它。对于生产,您可以改用 gunicorn。
添加
gunicorn
到您的 requirements.txt 并安装在您的生产环境中。在你的 app.py 文件中,添加一个变量
server = app.server
。在生产环境中,使用命令运行你的应用程序
gunicorn app:server
。其中,app
引用 app.py 文件,并server
引用我们在该文件中创建的变量。
请注意,gunicorn 是为 UNIX 开发的。该命令无法在 Windows 上运行。
在像 Digital Ocean 这样的平台上,使用生产服务器非常重要,因为服务无法访问本地主机。
解决方案 8:
这在 Windows 上对我有用:
$env:FLASK_APP="flask_project.py"
$env:FLASK_ENV="development"
flask run
flask_project.py 与我的虚拟环境位于同一路径上。
解决方案 9:
如果您想避免因红色燃烧而出现的警告,那么您只需从源文件中更改警告即可,而不会产生任何副作用……您仍将正常收到 http 响应状态代码。进入 C:\Python37\Lib\site-packages\werkzeug\serving.py 并进行更改。
解决方案 10:
烧瓶运行
调试模式:关闭 警告:这是一个开发服务器。请勿在生产部署中使用它。请改用生产 WSGI 服务器。
在http://127.0.0.1:5000上运行
按 CTRL+C 退出
我也收到了这个警告信息。但服务器运行正常。在你的情况下,它也运行正常,没有任何错误。检查 url = http://127.0.0.1:5000
扫码咨询,免费领取项目管理大礼包!