如何自定义Flask的启动消息?

3

我正在Cloud9中运行一个Flask应用程序。每当我启动Flask应用程序时,它会显示以下信息:

 * Serving Flask app "app" (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://0.0.0.0:80/ (Press CTRL+C to quit)

有没有办法更改这个消息?我想让它说些类似这样的话:

Connect to me at http://0.0.0.0:80/!

我在stackoverflow和网上搜索了很久,但是没有找到任何有用的信息。我使用app.run()启动我的应用程序。
此外,是否可能将URL变为青色?


该消息通过Python的日志接口记录在“INFO”级别 - 您应该能够更改所打印内容的级别(werkzeug记录器),然后输出您自己的消息。 - MatsLindh
@MatsLindh 你是指我修改源代码还是改变其他什么东西? - KTibow
1个回答

2

您可以通过更改flask.cli中的show_server_banner来更改除Running on http://0.0.0.0:80/ (Press CTRL+C to quit)之外的所有内容:

from flask import Flask
import sys

cli = sys.modules['flask.cli']

# put your own message here
cli.show_server_banner = lambda *x: click.echo("My nice message")

app = Flask(__name__)
app.run(host='0.0.0.0', port='80')

为了消除“Running on http://0.0.0.0:80/ ...”信息,您可以使用unittest.mock:
from unittest import mock
from werkzeug._internal import _log

def my_startup_log(*args):
    # log all messages except for the * Running on message
    if not args[1].startswith(" * Running on"):
        return _log(*args)

app = Flask(__name__)
with mock.patch('werkzeug.serving._log') as mocked:
    # patch the logger object and replace with own logger
    mocked.side_effect = my_startup_logger
    app.run(host='0.0.0.0', port='8000')

这种方法非常简陋,取决于Flask的内部实现。在生产代码中使用时要小心,因为这很容易出错。

因为它存在于werkzeug.serving中,并且是在run_simple的内部函数中定义的。我不知道有改变内部函数的可能性。 - Erich
能否将“Running on http://0.0.0.0:80/ (Press CTRL+C to quit)”中的所有内容都用不同的颜色显示? - KTibow
你可以在werkzeug.serving中模拟_log调用。但这将导致所有app.run的日志消息消失。这是期望的吗? - Erich
我找到了一种使用unittest.mock过滤消息的方法,已更新我的答案。 - Erich
1
你还可以告诉werkzeug记录器,你对“info”消息不感兴趣,这更加规范 - 使用_log = logging.getLogger('werkzeug')获取日志,然后更改级别,_log.setLevel(logging.WARNING)。这将使“info”级别上的非正式消息消失。你还可以使用日志过滤机制来创建一个自定义过滤器,删除任何以“* Running on”开头的内容,避免在生产代码中进行任何模拟。 - MatsLindh
显示剩余2条评论

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