Flask @ app.route'dan python konsoluna nasıl yazdırılır


90

/ Düğmesi kullanıcı tarafından çağrıldıktan sonra python konsoluna bir "merhaba dünya" yazdırmak istiyorum.

Bu benim saf yaklaşımım:

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

Arka plan: Diğer python komutlarını flask'tan (kabuktan değil) yürütmek istiyorum. "yazdır" en kolay durum olmalıdır. Burada temel bir dönüşü anlamadığıma inanıyorum. Şimdiden teşekkürler!


1
Burada iki şeyi karıştırıyorsunuz. Bir işleyiciden istediğiniz herhangi bir işlevi çağırabilirsiniz; ancak baskı ile ilgili sorun, Flask'ın stdout için yaptığı şeydir.
Daniel Roseman

Merhaba @DanielRoseman ve yorum için teşekkürler! Yani flask, baskıyı bir şekilde http'ye mi yönlendiriyor? Bunu önlemek için ne yapmalıyım? Soru aptalcaysa özür dilerim :)
Robert Filter

1
Aptalca soru yok :)
Ciaran Liedeman

Flask printyanıta yönlendirmiyor. Geliştirme sunucusunu bir terminal oturumundan çalıştırıyorsanız, çıktıyı orada göreceksiniz. Eğer uWSGI gibi bir WSGI sunucusu üzerinden çalıştırıyorsanız, bunun yerine çıktı günlüklerde görünecektir.
dirn

Şişeye nasıl başlıyorsun?
Ciaran Liedeman

Yanıtlar:


117

Görünüşe göre çözmüşsünüz, ancak bu yanıtı arayan diğerleri için bunu yapmanın kolay bir yolu stderr'e yazdırmaktır. Bunu şu şekilde yapabilirsiniz:

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, konsolda stderr'e yazdırılan şeyleri gösterecektir. Stderr'e yazdırmanın diğer yolları için bu stackoverflow gönderisine bakın


Thx @Gabe, bu gitmek için bir yol gibi görünüyor.
Robert Filtre

Gerçekten tüm dosyaların üzerine gidip eklemek gerekiyor mu from __future__ import print_functionda file=sys.stderrher baskı için? kısa bir yolu var mı?
e271p314

Orijinal cevapta bağlantı verdiğim gönderiye bir göz atmanızı tavsiye ederim. Her zaman stderr'e yazdıran bir işlev tanımlamanızı öneren bir kişi vardır (bunu zaten içe aktardığınız bir util dosyasına koyabilirsiniz). Başka bir kişi sys.stderr.write'ı öneriyor.
Gabe

Ayrıca birlikte tekrarı biraz kurtarabilecek: from sys import stderr, file=stderr. Python 3+ 'de ihtiyacınız yoktur from __future__ import print_function, bu varsayılan işlevdir.
phoenix

Bir nesneyi pprint(vars(myobject), sys.stderr)
döküyorsanız,

25

Konsolda veri yazdırmak için günlük kaydını da kullanabiliriz.

Misal:

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
Bilgi kaydedicinin çalışmasını sağlayamazsanız buna bakın
gunslingor

8

Bence Flask ile ilgili temel sorun, stdout'un tamponlanması. İle yazdırabildim print('Hi', flush=True). PYTHONUNBUFFEREDOrtam değişkenini (boş olmayan herhangi bir dizeye) ayarlayarak da arabelleğe almayı devre dışı bırakabilirsiniz .


Bu, özellikle küçük projelerde baskı hata ayıklamanın en iyi yoludur
öğrenci0000

PYTHONUNBUFFERED env değişkeninde ayarlanması gereken değer nedir?
thanos.a

1
@ thanos.a Boş olmayan herhangi bir dizeye ayarlayabilirsiniz. Cevabı güncelledim.
Chris

PYTHONUNBUFFERED = "birşey_burada" gibi bir örnek ekleyebilirsiniz
thanos.a

0

@Viraj Wadate'in kodunu çalıştırmayı denedim, ancak çıktıyı app.logger.infokonsoldan alamadım .

Almak için INFO, WARNINGve ERRORkonsolda mesajları, dictConfignesne tüm günlükleri (için günlük yapılandırması oluşturmak için kullanılabilir kaynak ):

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)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.