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


89

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

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

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

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


1
여기서 두 가지를 혼동하고 있습니다. 핸들러에서 원하는 함수를 호출 할 수 있습니다. 그러나 인쇄 문제는 Flask가 stdout에 수행하는 작업입니다.
Daniel Roseman 2015-09-13

안녕하세요 @DanielRoseman과 의견 주셔서 감사합니다! 그래서 플라스크는 인쇄물을 http로 다소 라우팅합니까? 이를 방지하려면 어떻게해야합니까? 질문이 어리석은 경우 죄송합니다 :)
Robert Filter

1
어떤 바보 같은 질문 :이 없습니다
인 Ciaran Liedeman

Flask는 print응답으로 라우팅되지 않습니다 . 터미널 세션에서 개발 서버를 실행하는 경우 출력이 표시됩니다. uWSGI와 같은 WSGI 서버를 통해 실행하는 경우 출력이 대신 로그에 나타납니다.
dirn

플라스크를 어떻게 시작합니까?
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, 이것은 갈 방법 인 것 같습니다.
Robert Filter

난 정말 모든 파일 가서 추가해야합니까 from __future__ import print_function또한 file=sys.stderr모든 인쇄를 위해? 짧은 방법이 있습니까?
e271p314

원래 답변에서 링크 한 게시물을 살펴 보는 것이 좋습니다. 한 사람이 항상 stderr로 인쇄하는 함수를 정의하도록 권장합니다 (이미 가져온 util 파일에 넣을 수 있음). 다른 사람이 sys.stderr.write를 권장합니다.
Gabe

다음을 사용하여 약간의 반복을 줄일 수도 있습니다. from sys import stderr, file=stderr. Python 3 이상에서는 from __future__ import print_function기본 기능인은 필요하지 않습니다 .
phoenix

객체를 덤핑하는 경우 이것이 작동하는 것 같습니다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)

1
: 당신이 직장에 대한 정보 로거 얻을 수없는 경우이 참조 flask.palletsprojects.com/en/1.0.x/logging
gunslingor

8

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


특히 작은 프로젝트에, 인쇄 디버깅을위한 최선의 방법입니다
learner0000

PYTHONUNBUFFERED 환경 변수에 설정해야하는 값은 무엇입니까?
thanos.a

1
@ thanos.a 비어 있지 않은 문자열로 설정할 수 있습니다. 답변을 업데이트했습니다.
Chris

PYTHONUNBUFFERED = "anything_here"와 같은 예를 추가 할 수 있습니다.
thanos.a

0

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.