Как печатать из Flask @ app.route в консоль Python

88

Я хотел бы просто напечатать "привет, мир" на консоли python после того, как пользователь вызвал кнопку /.

Это мой наивный подход:

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

Справочная информация: я хотел бы выполнять другие команды python из фляги (не оболочки). «печать» должно быть самым простым случаем. Думаю, я не понял здесь одного основного поворота. Заранее спасибо!

Роберт Фильтр
источник
1
Вы путаете здесь две вещи. Вы можете вызывать любые функции из обработчика; но проблема с печатью заключается в том, что Flask делает с stdout.
Дэниел Роузман,
Привет, @DanielRoseman, спасибо за комментарий! Значит, колба несколько направляет печать на http? Что мне делать, чтобы этого не произошло? Простите, если вопрос глупый :)
Роберт Фильтр
1
Нет глупых вопросов :)
Ciaran Liedeman
Flask не направляет printответ. Если вы запускаете сервер разработки из сеанса терминала, вы увидите результат там. Если вы запускаете его через сервер WSGI, такой как uWSGI, вместо этого вывод будет отображаться в журналах.
dirn
Как вы запускаете колбу?
Ciaran Liedeman

Ответы:

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

Гейб
источник
Спасибо @Gabe, похоже, это выход.
Роберт Фильтр
Мне действительно нужно идти на все файлы и добавить from __future__ import print_functionтакже file=sys.stderrдля каждой печати? есть короткий путь к этому?
e271p314
Я бы порекомендовал взглянуть на сообщение, на которое я ссылался в исходном ответе. Один человек рекомендует определить функцию, которая всегда печатает в stderr (вы можете поместить это в файл util, который вы уже импортируете). Другой человек рекомендует sys.stderr.write.
Гейб
Вы также можете сэкономить немного повторения с помощью: from sys import stderr, file=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переменной среды (любую непустую строку).

Крис
источник
Это лучший способ отладки печати, особенно в небольших проектах
Learner0000
Какое значение следует установить в переменной env PYTHONUNBUFFERED?
thanos.a
1
@ thanos.a Вы можете указать любую непустую строку. Я обновил ответ.
Крис
Вы можете добавить такой пример, как PYTHONUNBUFFERED = "
something_here