Come stampare da Flask @ app.route alla console Python


88

Vorrei semplicemente stampare un "ciao mondo" sulla console python dopo che il pulsante / è stato chiamato dall'utente.

Questo è il mio approccio ingenuo:

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

Background: vorrei eseguire altri comandi python da flask (non shell). "print" dovrebbe essere il caso più semplice. Credo di non aver capito una svolta fondamentale qui. Grazie in anticipo!


1
Stai confondendo due cose qui. Puoi chiamare tutte le funzioni che ti piacciono da un gestore; ma il problema con print è quello che Flask sta facendo allo stdout.
Daniel Roseman

Ciao @DanielRoseman e grazie per il commento! Quindi Flask sta in qualche modo indirizzando la stampa a http? Cosa devo fare per evitarlo? Scusa se la domanda è sciocca :)
Robert Filter

1
Non ci sono domande stupide :)
Ciaran Liedeman

Flask non instrada printalla risposta. Se stai eseguendo il server di sviluppo da una sessione terminale, vedrai l'output lì. Se lo stai eseguendo tramite un server WSGI come uWSGI, l'output apparirà invece nei log.
Dirn

Come stai iniziando la fiaschetta?
Ciaran Liedeman

Risposte:


116

Sembra che tu abbia risolto, ma per gli altri che cercano questa risposta, un modo semplice per farlo è stampare su stderr. Puoi farlo in questo modo:

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 mostrerà le cose stampate su stderr nella console. Per altri modi di stampare su stderr, vedere questo post di stackoverflow


Grazie a @Gabe, questa sembra essere la strada da percorrere.
Robert Filter

Ho davvero bisogno di rivedere tutti i file e aggiungere from __future__ import print_functionanche file=sys.stderrper ogni stampa? c'è una strada breve per arrivarci?
e271p314

Consiglierei di dare un'occhiata al post a cui ho linkato nella risposta originale. C'è una persona che consiglia di definire una funzione che stampa sempre su stderr (potresti inserirla in un file util che già importi). Un'altra persona consiglia sys.stderr.write.
Gabe

Puoi anche risparmiare un po 'di ripetizioni con: from sys import stderr, file=stderr. In Python 3+, non è necessario from __future__ import print_function, questa è la funzionalità predefinita.
phoenix

Se lo scarico di un oggetto sembra funzionarepprint(vars(myobject), sys.stderr)
jcroll

25

Possiamo anche utilizzare la registrazione per stampare i dati sulla console.

Esempio:

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)

Vedi questo se non riesci a far funzionare il logger delle informazioni: flask.palletsprojects.com/en/1.0.x/logging
gunslingor

8

Penso che il problema principale con Flask sia che lo stdout viene bufferizzato. Sono stato in grado di stampare con print('Hi', flush=True). Puoi anche disabilitare il buffering impostando la PYTHONUNBUFFEREDvariabile d'ambiente (su qualsiasi stringa non vuota).


Questo è il modo migliore per il debug di stampa, specialmente in piccoli progetti
learner0000

Qual è il valore che dovrebbe essere impostato nella variabile env PYTHONUNBUFFERED?
grazie, l'

1
@ thanos.a Puoi impostarlo su qualsiasi stringa non vuota. Ho aggiornato la risposta.
Chris

Puoi aggiungere un esempio come PYTHONUNBUFFERED = "anything_here"
thanos.a
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.