So drucken Sie von Flask @ app.route zur Python-Konsole

88

Ich möchte einfach eine "Hallo Welt" auf die Python-Konsole drucken, nachdem / button vom Benutzer aufgerufen wurde.

Das ist mein naiver Ansatz:

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

Hintergrund: Ich möchte andere Python-Befehle von flask (nicht shell) ausführen. "Drucken" sollte der einfachste Fall sein. Ich glaube, ich habe hier keine grundlegende Wendung verstanden. Danke im Voraus!

Robert Filter
quelle
1
Sie verwechseln hier zwei Dinge. Sie können beliebige Funktionen von einem Handler aus aufrufen. Aber das Problem mit dem Druck ist, was Flask tut, um zu stdout.
Daniel Roseman
Hallo @DanielRoseman und danke für den Kommentar! Also leitet die Flasche den Druck etwas an http weiter? Was soll ich tun, um dies zu verhindern? Entschuldigung, wenn die Frage albern ist :)
Robert Filter
1
Es gibt keine dummen Fragen :)
Ciaran Liedeman
Der Kolben leitet nicht printzur Antwort weiter. Wenn Sie den Entwicklungsserver von einer Terminalsitzung aus ausführen, wird dort die Ausgabe angezeigt. Wenn Sie es über einen WSGI-Server wie uWSGI ausführen, wird die Ausgabe stattdessen in den Protokollen angezeigt.
Dirn
Wie fängst du die Flasche an?
Ciaran Liedeman

Antworten:

116

Es scheint, als hätten Sie es geschafft, aber für andere, die nach dieser Antwort suchen, ist eine einfache Möglichkeit, dies zu tun, das Drucken auf stderr. Sie können das so machen:

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 zeigt Dinge an, die in der Konsole auf stderr gedruckt wurden. Weitere Möglichkeiten zum Drucken auf stderr finden Sie in diesem Beitrag zum Stapelüberlauf

Gabe
quelle
Thx @Gabe, dies scheint ein guter Weg zu sein.
Robert Filter
Muss ich wirklich alle Dateien durchgehen und from __future__ import print_functionauch file=sys.stderrfür jeden Druck hinzufügen ? Gibt es einen kurzen Weg dorthin?
e271p314
Ich würde empfehlen, einen Blick auf den Beitrag zu werfen, auf den ich in der ursprünglichen Antwort verlinkt habe. Es gibt eine Person, die empfiehlt, eine Funktion zu definieren, die immer in stderr gedruckt wird (Sie können dies in eine Util-Datei einfügen, die Sie bereits importieren). Eine andere Person empfiehlt sys.stderr.write.
Gabe
Sie können auch ein wenig Wiederholung sparen mit: from sys import stderr, file=stderr. In Python 3+ benötigen Sie nicht from __future__ import print_function, das ist die Standardfunktionalität.
Phoenix
Wenn ein Objekt pprint(vars(myobject), sys.stderr)
abgeladen wird,
23

Wir können die Protokollierung auch verwenden, um Daten auf der Konsole zu drucken.

Beispiel:

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
quelle
Sehen Sie dies, wenn Sie den Info-Logger nicht zum Laufen bringen können
Gunslingor
8

Ich denke, das Kernproblem bei Flask ist, dass stdout gepuffert wird. Ich konnte mit drucken print('Hi', flush=True). Sie können die Pufferung auch deaktivieren, indem Sie die PYTHONUNBUFFEREDUmgebungsvariable (auf eine nicht leere Zeichenfolge) setzen.

Chris
quelle
Dies ist der beste Weg für das Druck-Debugging, insbesondere bei kleinen Projekten
learner0000
Welchen Wert sollte in der Variablen PYTHONUNBUFFERED env festgelegt werden?
thanos.a
1
@ thanos.a Sie können eine beliebige nicht leere Zeichenfolge festlegen. Ich habe die Antwort aktualisiert.
Chris
Sie können ein Beispiel wie PYTHONUNBUFFERED = "irgendetwas_hier"
hinzufügen