Comment imprimer depuis Flask @ app.route vers la console Python

88

Je voudrais simplement imprimer un "hello world" sur la console python après que le bouton / soit appelé par l'utilisateur.

Voici mon approche naïve:

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

Contexte: je voudrais exécuter d'autres commandes python à partir de flask (pas de shell). "imprimer" devrait être le cas le plus simple. Je crois que je n'ai pas compris ici une torsion de base. Merci d'avance!

Robert Filter
la source
1
Vous confondez deux choses ici. Vous pouvez appeler toutes les fonctions de votre choix à partir d'un gestionnaire; mais le problème avec print est ce que Flask fait sur stdout.
Daniel Roseman du
Salut @DanielRoseman et merci pour le commentaire! Donc flask achemine quelque peu l'impression vers http? Que dois-je faire pour éviter cela? Désolé si la question est idiote :)
Robert Filter
1
Il n'y a pas de questions idiotes :)
Ciaran Liedeman
Flask n'achemine pas printvers la réponse. Si vous exécutez le serveur de développement à partir d'une session de terminal, vous y verrez la sortie. Si vous l'exécutez via un serveur WSGI tel que uWSGI, la sortie apparaîtra dans les journaux à la place.
dirn le
Comment commencez-vous flask?
Ciaran Liedeman

Réponses:

116

Il semble que vous ayez travaillé, mais pour ceux qui recherchent cette réponse, un moyen simple de le faire est d'imprimer sur stderr. Vous pouvez faire cela comme ceci:

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 affichera les éléments imprimés sur stderr dans la console. Pour d'autres façons d'imprimer sur stderr, consultez ce post stackoverflow

Gabe
la source
Thx @Gabe, cela semble être une voie à suivre.
Robert Filter du
Ai-je vraiment besoin de parcourir tous les fichiers et d'ajouter from __future__ import print_functionégalement file=sys.stderrpour chaque impression? y a-t-il un chemin court pour y arriver?
e271p314
Je recommanderais de jeter un œil au post auquel j'ai lié dans la réponse originale. Une personne recommande de définir une fonction qui s'imprime toujours sur stderr (vous pouvez la mettre dans un fichier util que vous importez déjà). Une autre personne recommande sys.stderr.write.
Gabe
Vous pouvez également économiser un peu de répétition avec: from sys import stderr, file=stderr. Dans Python 3+, vous n'avez pas besoin from __future__ import print_function, c'est la fonctionnalité par défaut.
phoenix
Si jeter un objet, cela semble fonctionnerpprint(vars(myobject), sys.stderr)
jcroll
25

Nous pouvons également utiliser la journalisation pour imprimer des données sur la console.

Exemple:

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
la source
Voir si vous ne pouvez pas obtenir l'enregistreur d'information au travail: flask.palletsprojects.com/en/1.0.x/logging
gunslingor
8

Je pense que le problème principal avec Flask est que stdout est mis en mémoire tampon. J'ai pu imprimer avec print('Hi', flush=True). Vous pouvez également désactiver la mise en mémoire tampon en définissant la PYTHONUNBUFFEREDvariable d'environnement (sur n'importe quelle chaîne non vide).

Chris
la source
C'est le meilleur moyen pour le débogage d'impression, en particulier dans les petits projets
Learner0000
Quelle est la valeur à définir dans la variable d'environnement PYTHONUNBUFFERED?
thanos.a
1
@ thanos.a Vous pouvez le définir sur n'importe quelle chaîne non vide. J'ai mis à jour la réponse.
Chris le
Vous pouvez ajouter un exemple comme PYTHONUNBUFFERED = "n'importe
quoi_ici