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!


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


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)

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).


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.