如何在Flask的@app.route中将内容打印到Python控制台

124

当用户调用 /button 时,我想简单地在 Python 控制台上打印“hello world”。

这是我的朴素方法:

@app.route('/button/')
def button_clicked():
    print 'Hello world!'
    return redirect('/')

背景:我想从Flask中执行其他的Python命令(不是shell)。 “print”应该是最简单的情况。 我相信我在这里没有理解一个基本的要点。


1
你在这里混淆了两个不同的事情。你可以从处理程序中调用任何函数;但是print语句的问题在于Flask对标准输出(stdout)所做的处理。 - Daniel Roseman
3
没有愚蠢的问题 :) - Ciaran Liedeman
Flask不会将print路由到响应中。如果您从终端会话运行开发服务器,则将在那里看到输出。如果您通过WSGI服务器(如uWSGI)运行它,则输出将出现在日志中。 - dirn
嗨@ciaran,我正在使用Pyscripter启动脚本。这应该相当于Python myscript.py。 - Robert Filter
只是补充一下,所有的都是正确的。在这里,print不是为了在控制台提供输出而设计的。 - Robert Filter
显示剩余3条评论
4个回答

157

一个简单的方法是将内容打印到stderr. 你可以像这样做:

from __future__ import print_function # In python 2.7
import sys

@app.route('/button/')
def button_clicked():
    print('Hello world!', file=sys.stderr)
    return redirect('/')

Flask会在控制台中显示输出到stderr的内容。对于其他输出到stderr的方式,请参考此stackoverflow帖子


我真的需要遍历所有文件并添加 from __future__ import print_functionfile=sys.stderr 到每个打印语句吗?有没有更简单的方法? - e271p314
我建议查看原始答案中我提供的链接。有一个人建议定义一个函数,该函数始终将内容打印到stderr(您可以将其放在已经导入的util文件中)。另一个人建议使用sys.stderr.write。 - Gabe
你也可以通过 from sys import stderrfile=stderr 来减少一些重复。在 Python 3+ 中,你不需要使用 from __future__ import print_function,因为它是默认功能。 - phoenix
如果要转储一个对象,可以使用以下代码:pprint(vars(myobject), sys.stderr) - jcroll
我正在使用flask run命令在命令提示符中运行应用程序。我的IDE是pycharm。在运行配置中,我将其设置为在输出控制台中模拟终端。当我尝试这样做时,无论在终端还是Python控制台中都没有任何打印输出。有什么想法是哪里出了问题吗? - Anonymous12332313

39
我们也可以使用日志记录在控制台上打印数据。
示例:
import logging
from flask import Flask

app = Flask(__name__)

@app.route('/print')
def printMsg():
    app.logger.warning('testing warning log')
    app.logger.error('testing error log')
    app.logger.info('testing info log')
    return "Check your console"

if __name__ == '__main__':
    app.run(debug=True)

5
如果您无法使信息记录器正常工作,请参考此链接:https://flask.palletsprojects.com/en/1.0.x/logging/。 - gunslingor

26

我认为 Flask 的核心问题在于 stdout 被缓冲了。你可以使用 print('Hi', flush=True) 命令来打印信息。你也可以通过将 PYTHONUNBUFFERED 环境变量设置为任何非空字符串来禁用缓冲。


1
这是最好的打印调试方式,尤其适用于小型项目。 - learner0000
PYTHONUNBUFFERED环境变量应该设置什么值? - thanos.a
1
@thanos.a 你可以将其设置为任何非空字符串。我已经更新了答案。 - Chris
你可以添加一个示例,例如PYTHONUNBUFFERED="anything_here"。 - thanos.a

4
我尝试运行@Viraj Wadate的代码,但无法从控制台获取app.logger.info的输出。 为了在控制台中获取INFOWARNINGERROR信息,可以使用dictConfig对象为所有日志创建日志配置(参考来源:source):
from logging.config import dictConfig
from flask import Flask


dictConfig({
    'version': 1,
    'formatters': {'default': {
        'format': '[%(asctime)s] %(levelname)s in %(module)s: %(message)s',
    }},
    'handlers': {'wsgi': {
        'class': 'logging.StreamHandler',
        'stream': 'ext://flask.logging.wsgi_errors_stream',
        'formatter': 'default'
    }},
    'root': {
        'level': 'INFO',
        'handlers': ['wsgi']
    }
})


app = Flask(__name__)

@app.route('/')
def index():
    return "Hello from Flask's test environment"

@app.route('/print')
def printMsg():
    app.logger.warning('testing warning log')
    app.logger.error('testing error log')
    app.logger.info('testing info log')
    return "Check your console"

if __name__ == '__main__':
    app.run(debug=True)


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