Jak drukować z Flask @ app.route do konsoli Pythona

88

Chciałbym po prostu wydrukować "hello world" w konsoli Pythona po wywołaniu przycisku / przez użytkownika.

To jest moje naiwne podejście:

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

Tło: Chciałbym wykonywać inne polecenia Pythona z flaski (nie powłoki). „Drukuj” powinno być przypadkiem najłatwiejszym. Wydaje mi się, że nie zrozumiałem tutaj podstawowego zwrotu. Z góry dziękuję!

Robert Filter
źródło
1
Mylisz tutaj dwie rzeczy. Możesz wywołać dowolne funkcje z programu obsługi; ale problem z print polega na tym, co Flask robi na standardowe wyjście.
Daniel Roseman,
Cześć @DanielRoseman i dzięki za komentarz! Więc flask w pewnym sensie kieruje wydruk do http? Co powinienem zrobić, aby temu zapobiec? Przepraszam, jeśli pytanie jest głupie :)
Robert Filter
1
Nie ma głupich pytań :)
Ciaran Liedeman
Flask nie kieruje printdo odpowiedzi. Jeśli uruchamiasz serwer deweloperski z sesji terminala, zobaczysz tam dane wyjściowe. Jeśli uruchamiasz go przez serwer WSGI, taki jak uWSGI, dane wyjściowe pojawią się w dziennikach.
dirn
Jak zaczynasz kolbę?
Ciaran Liedeman

Odpowiedzi:

116

Wygląda na to, że masz już to opracowane, ale dla innych, którzy szukają tej odpowiedzi, prostym sposobem jest wydrukowanie na stderr. Możesz to zrobić w ten sposób:

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 wyświetli w konsoli rzeczy wydrukowane na stderr. Aby poznać inne sposoby drukowania na stderr, zobacz ten post o przepływie stosu

Gabe
źródło
Dzięki @ Gabe, wydaje się, że to dobry sposób.
Robert Filter
Czy naprawdę muszę przeglądać wszystkie pliki i dodawać je from __future__ import print_functionrównież file=sys.stderrprzy każdym wydruku? czy jest do tego krótka droga?
e271p314
Polecam spojrzeć na post, do którego zamieściłem link w oryginalnej odpowiedzi. Jedna osoba zaleca zdefiniowanie funkcji, która zawsze drukuje na stderr (możesz umieścić to w pliku util, który już zaimportowałeś). Inna osoba poleca sys.stderr.write.
Gabe
Możesz także zaoszczędzić trochę powtórzeń za pomocą: from sys import stderr, file=stderr. W Pythonie 3+ nie potrzebujesz from __future__ import print_function, to jest domyślna funkcjonalność.
phoenix
Jeśli wyrzucenie obiektu wydaje się działaćpprint(vars(myobject), sys.stderr)
jcroll
25

Za pomocą logowania możemy również wydrukować dane na konsoli.

Przykład:

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)
Viraj Wadate
źródło
Zobacz to, jeśli nie możesz uruchomić rejestratora informacji: flask.palletsprojects.com/en/1.0.x/logging
gunslingor
8

Myślę, że podstawowy problem z Flaskiem polega na tym, że standardowe wyjście jest buforowane. Mogłem drukować z print('Hi', flush=True). Możesz również wyłączyć buforowanie, ustawiając PYTHONUNBUFFEREDzmienną środowiskową (na dowolny niepusty ciąg).

Chris
źródło
To najlepszy sposób na debugowanie druku, szczególnie w małych projektach
learner0000
Jaką wartość należy ustawić w zmiennej env PYTHONUNBUFFERED?
thanos. A
1
@ thanos.a Możesz ustawić dowolny niepusty ciąg. Zaktualizowałem odpowiedź.
Chris
Możesz dodać przykład, na przykład PYTHONUNBUFFERED = "cokolwiek_tutaj"
thanos.a