Як надрукувати з Flask @ app.route на консолі python


88

Я хотів би просто надрукувати "привіт світ" на консолі python після того, як користувач викликає кнопку.

Це мій наївний підхід:

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

Передумови: Я хотів би виконувати інші команди python з колби (не оболонки). "друк" повинен бути найпростішим випадком. Я вважаю, що я не зрозумів основного повороту тут. Спасибі заздалегідь!


1
Ви тут плутаєте дві речі. Ви можете викликати будь-які функції, які вам подобаються, з обробника; але проблема з друком полягає в тому, що Flask робить для stdout.
Даніель Роузман

Привіт @DanielRoseman і дякую за коментар! Отже, колба дещо перенаправляє друк на http? Що я повинен зробити, щоб запобігти цьому? Вибачте, якщо питання безглузде :)
Роберт Фільтр


Колба не направляється 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('/')

Колба відображатиме речі, надруковані на stderr у консолі. Інші способи друку на stderr див. У цій публікації stackoverflow


Thx @Gabe, це, здається, шлях.
Роберт Фільтр

Чи справді мені потрібно переглядати всі файли та додавати from __future__ import print_functionтакож file=sys.stderrдля кожного друку? чи є короткий шлях до нього?
e271p314,

Я б порадив поглянути на пост, на який я посилався в оригінальній відповіді. Існує одна особа, яка рекомендує визначити функцію, яка завжди друкується в stderr (ви можете помістити це у файл утиліти, який ви вже імпортуєте). Інша особа рекомендує 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 = "anything_here"
thanos.a
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.