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!


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


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)

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


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.