Flask @ app.routeからPythonコンソールに印刷する方法


88

ユーザーが/ buttonを呼び出した後、Pythonコンソールに「helloworld」を出力したいと思います。

これは私の素朴なアプローチです:

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

背景:(シェルではなく)フラスコから他のPythonコマンドを実行したいと思います。「印刷」が最も簡単なケースです。私はここで基本的なひねりを理解していないと思います。前もって感謝します!


1
ここで2つのことを混同しています。ハンドラーから好きな関数を呼び出すことができます。しかし、印刷の問題は、Flaskがstdoutに対して行っていることです。
ダニエルローズマン2015

こんにちは@DanielRosemanとコメントをありがとう!それで、フラスコはプリントをhttpにいくらかルーティングしていますか?これを防ぐにはどうすればよいですか?質問がばかげている場合は申し訳ありません:)
ロバートフィルター

1
ばかげた質問はありません:)
Ciaran Liedeman 2015

Flaskはprint応答にルーティングしません。ターミナルセッションから開発サーバーを実行している場合は、そこに出力が表示されます。uWSGIなどのWSGIサーバーを介して実行している場合は、代わりに出力がログに表示されます。
2015

フラスコをどのように始めていますか?
Ciaran Liedeman 2015

回答:


116

うまくいったようですが、この答えを探している他の人にとって、これを行う簡単な方法は、stderrに印刷することです。あなたはこのようにそれを行うことができます:

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は、stderrに印刷されたものをコンソールに表示します。stderrに印刷する他の方法については、このstackoverflowの投稿を参照してください


Thx @Gabe、これは行く方法のようです。
ロバートフィルター

本当にすべてのファイルを調べfrom __future__ import print_functionfile=sys.stderr、すべての印刷物にも追加する必要がありますか?それへの短い方法はありますか?
e271p314 2017

元の回答でリンクした投稿を確認することをお勧めします。常にstderrに出力する関数を定義することをお勧めする人がいます(これは、すでにインポートしたutilファイルに入れることができます)。別の人がsys.stderr.writeを推奨しています。
Gabe 2017

あなたはまた、と繰り返しの少しを救うことができます:from sys import stderrfile=stderr。Python 3以降from __future__ import print_functionでは、これはデフォルトの機能である必要はありません。
フェニックス

オブジェクトをダンプすることは、これは仕事に思われる場合pprint(vars(myobject), sys.stderr)
jcroll

25

ロギングを使用して、コンソールにデータを印刷することもできます。

例:

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)

:あなたが仕事への情報ロガー得ることができない場合は、これを参照してくださいflask.palletsprojects.com/en/1.0.x/logging
gunslingor

8

Flaskの中心的な問題は、stdoutがバッファリングされることだと思います。で印刷できましたprint('Hi', flush=True)PYTHONUNBUFFERED環境変数を(空でない文字列に)設定して、バッファリングを無効にすることもできます。


これは、特に小規模なプロジェクトでは、プリント・デバッグするための最良の方法です
learner0000

PYTHONUNBUFFERED環境変数に設定する必要がある値は何ですか?
thanos.a

1
@ thanos.a空でない任意の文字列に設定できます。答えを更新しました。
クリス

PYTHONUNBUFFERED = "anything_here"のような例を追加できます
thanos.a
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.