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!


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


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)

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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.