Cómo imprimir desde Flask @ app.route a la consola de Python

88

Me gustaría simplemente imprimir un "hola mundo" en la consola de Python después de que el usuario llame al botón /.

Este es mi enfoque ingenuo:

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

Antecedentes: me gustaría ejecutar otros comandos de Python desde el matraz (no el shell). "imprimir" debería ser el caso más fácil. Creo que no he entendido un giro básico aquí. ¡Gracias por adelantado!

Robert Filter
fuente
1
Estás confundiendo dos cosas aquí. Puede llamar a cualquier función que desee desde un controlador; pero el problema con la impresión es lo que Flask está haciendo para stdout.
Daniel Roseman
Hola @DanielRoseman y gracias por el comentario! Entonces, ¿flask está enrutando la impresión a http? ¿Qué debo hacer para prevenir esto? Lo siento si la pregunta es tonta :)
Robert Filter
1
No hay preguntas tontas :)
Ciaran Liedeman
El frasco no se dirige printa la respuesta. Si está ejecutando el servidor de desarrollo desde una sesión de terminal, verá el resultado allí. Si lo está ejecutando a través de un servidor WSGI como uWSGI, la salida aparecerá en los registros.
Dirn
¿Cómo estás empezando matraz?
Ciaran Liedeman

Respuestas:

116

Parece que lo ha resuelto, pero para otros que buscan esta respuesta, una forma fácil de hacerlo es imprimiendo en stderr. Puedes hacerlo así:

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 mostrará las cosas impresas en stderr en la consola. Para conocer otras formas de imprimir en stderr, consulte esta publicación de stackoverflow

Gabe
fuente
Gracias @Gabe, esto parece ser un camino a seguir.
Robert Filter
¿Realmente necesito revisar todos los archivos y agregar from __future__ import print_functiontambién file=sys.stderrpara cada impresión? ¿Hay un camino corto para ello?
e271p314
Recomendaría echar un vistazo a la publicación a la que vinculé en la respuesta original. Hay una persona que recomienda definir una función que siempre imprima en stderr (puede poner esto en un archivo util que ya haya importado). Otra persona recomienda sys.stderr.write.
Gabe
También puede ahorrar un poco de repetición con: from sys import stderr, file=stderr. En Python 3+, no es necesario from __future__ import print_function, esa es la funcionalidad predeterminada.
Phoenix
Si vaciar un objeto, esto parece funcionarpprint(vars(myobject), sys.stderr)
jcroll
25

También podemos usar el registro para imprimir datos en la consola.

Ejemplo:

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
fuente
Vea esto si no puede hacer que el registrador de información funcione: flask.palletsprojects.com/en/1.0.x/logging
gunslingor
8

Creo que el problema principal con Flask es que stdout se almacena en búfer. Pude imprimir con print('Hi', flush=True). También puede deshabilitar el almacenamiento en búfer configurando la PYTHONUNBUFFEREDvariable de entorno (en cualquier cadena que no esté vacía).

Chris
fuente
Esta es la mejor manera de depurar la impresión, especialmente en proyectos pequeños
learner0000
¿Cuál es el valor que debe establecerse en la variable env PYTHONUNBUFFERED?
thanos.a
1
@ thanos.a Puede establecerlo en cualquier cadena que no esté vacía. Actualicé la respuesta.
Chris
Puede agregar un ejemplo como PYTHONUNBUFFERED = "anything_here"
thanos.a