如何从Flask @ app.route打印到python控制台


88

我想在用户/ button被调用后,简单地将“ hello world”打印到python控制台。

这是我的幼稚方法:

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

背景:我想从flask(而不是shell)执行其他python命令。“打印”应该是最简单的情况。我相信我对这里的基本理解还不了解。提前致谢!


1
您在这里混淆了两件事。您可以从处理程序中调用所需的任何函数;但是打印的问题是Flask对标准输出的作用。
丹尼尔·罗斯曼

嗨@DanielRoseman,谢谢你的评论!那么flask会将打印内容路由到http了吗?我应该怎么做才能防止这种情况?抱歉,这个问题很愚蠢:)
Robert Filter

1
没有愚蠢的问题:)
Ciaran Liedeman 2015年

Flask无法路由print到响应。如果您从终端会话运行开发服务器,则将在此处看到输出。如果通过诸如uWSGI之类的WSGI服务器运行它,则输出将显示在日志中。
2015年

你如何开始烧瓶?
Ciaran Liedeman 2015年

Answers:


116

看来您已经解决了问题,但是对于其他寻求此答案的人来说,一种简单的方法是通过打印到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帖子。


Thx @Gabe,这似乎是一条路。
罗伯特·

我真的需要去对所有文件,并添加from __future__ import print_functionfile=sys.stderr为每个打印?有没有很短的路要走?
e271p314

我建议您看一下我在原始答案中链接到的帖子。建议有人定义一个始终打印到stderr的函数(您可以将其放在已导入的util文件中)。另一个人建议使用sys.stderr.write。
加布

你也可以保存重复一点点:from sys import stderrfile=stderr。在Python 3+中,您不需要from __future__ import print_function,这是默认功能。
凤凰城

如果转储对象,这似乎可行pprint(vars(myobject), sys.stderr)
jcroll

25

我们还可以使用日志记录在控制台上打印数据。

例:

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)

看到这个,如果你不能得到的信息记录工作:flask.palletsprojects.com/en/1.0.x/logging
gunslingor

8

我认为Flask的核心问题是stdout会被缓冲。我能够用打印print('Hi', flush=True)。您还可以通过将PYTHONUNBUFFERED环境变量(设置为任何非空字符串)来禁用缓冲。


这是进行打印调试的最佳方法,尤其是在小型项目中
learninger0000

在PYTHONUNBUFFERED env变量中应该设置什么值?
thanos.a

1
@ thanos.a可以将其设置为任何非空字符串。我更新了答案。
克里斯

您可以添加一个示例,例如PYTHONUNBUFFERED =“ anything_here”
thanos.a,
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.