[python] Flask @ app.route에서 Python 콘솔로 인쇄하는 방법

사용자가 / button을 호출 한 후 파이썬 콘솔에 “hello world”를 간단히 인쇄하고 싶습니다.

이것은 내 순진한 접근 방식입니다.

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

배경 : 플라스크 (쉘이 아님)에서 다른 파이썬 명령을 실행하고 싶습니다. “인쇄”가 가장 쉬운 경우입니다. 나는 여기서 기본적인 비틀기를 이해하지 못했다고 생각합니다. 미리 감사드립니다!



답변

당신이 해결 한 것처럼 보이지만이 답변을 찾는 다른 사람들에게는 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 게시물을 참조하십시오.


답변

로깅을 사용하여 콘솔에서 데이터를 인쇄 할 수도 있습니다.

예:

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의 핵심 문제는 stdout이 버퍼링된다는 것입니다. 로 인쇄 할 수있었습니다 print('Hi', flush=True). PYTHONUNBUFFERED환경 변수를 비어 있지 않은 문자열 로 설정하여 버퍼링을 비활성화 할 수도 있습니다 .


답변

@Viraj Wadate의 코드를 실행 해 보았지만 app.logger.info콘솔 에서 출력을 얻을 수 없습니다 .

얻으려면 INFO, WARNING그리고 ERROR콘솔의 메시지의 dictConfig목적은 모든 로그 (로깅 구성을 만드는 데 사용할 수있는 소스 ) :

from logging.config import dictConfig
from flask import Flask


dictConfig({
    'version': 1,
    'formatters': {'default': {
        'format': '[%(asctime)s] %(levelname)s in %(module)s: %(message)s',
    }},
    'handlers': {'wsgi': {
        'class': 'logging.StreamHandler',
        'stream': 'ext://flask.logging.wsgi_errors_stream',
        'formatter': 'default'
    }},
    'root': {
        'level': 'INFO',
        'handlers': ['wsgi']
    }
})


app = Flask(__name__)

@app.route('/')
def index():
    return "Hello from Flask's test environment"

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


답변