Cách in từ Flask @ app.route sang bảng điều khiển python


88

Tôi chỉ muốn in "hello world" vào bảng điều khiển python sau khi nút / được người dùng gọi.

Đây là cách tiếp cận ngây thơ của tôi:

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

Thông tin cơ bản: Tôi muốn thực hiện các lệnh python khác từ flask (không phải shell). "print" nên là trường hợp dễ nhất. Tôi tin rằng tôi đã không hiểu một cách cơ bản ở đây. Cảm ơn trước!


1
Bạn đang nhầm lẫn hai điều ở đây. Bạn có thể gọi bất kỳ chức năng nào bạn thích từ một trình xử lý; nhưng vấn đề với bản in là những gì Flask đang làm với stdout.
Daniel Roseman

Xin chào @DanielRoseman và cảm ơn vì nhận xét! Vì vậy, bình đang định tuyến phần nào bản in đến http? Tôi phải làm gì để ngăn chặn điều này? Xin lỗi nếu câu hỏi là ngớ ngẩn :)
Robert Lọc

1
Chưa có câu hỏi ngớ ngẩn :)
Ciaran Liedeman

Bình không định tuyến printđến phản hồi. Nếu bạn đang chạy máy chủ phát triển từ một phiên đầu cuối, bạn sẽ thấy kết quả ở đó. Nếu bạn đang chạy nó thông qua một máy chủ WSGI chẳng hạn như uWSGI, kết quả đầu ra sẽ xuất hiện trong nhật ký.
dirn

Bạn đang bắt đầu bình như thế nào?
Ciaran Liedeman

Câu trả lời:


116

Có vẻ như bạn đã giải quyết được vấn đề, nhưng đối với những người khác đang tìm kiếm câu trả lời này, một cách dễ dàng để làm điều này là in ra stderr. Bạn có thể làm như thế này:

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 sẽ hiển thị những thứ được in ra stderr trong bảng điều khiển. Để biết các cách in khác sang stderr, hãy xem bài đăng stackoverflow này


Thx @Gabe, đây có vẻ là một cách để đi.
Robert Filter

Tôi thực sự cần phải đi qua tất cả các file và thêm from __future__ import print_functioncũng file=sys.stderrcho mỗi bản in? có một con đường ngắn để nó?
e271p314

Tôi khuyên bạn nên xem bài đăng mà tôi đã liên kết trong câu trả lời ban đầu. Có một người khuyên bạn nên xác định một hàm luôn in ra stderr (bạn có thể đặt nó vào một tệp sử dụng mà bạn đã nhập). Một người khác đề xuất sys.stderr.write.
Gabe

Bạn cũng có thể tiết kiệm một chút lặp lại với: from sys import stderr, file=stderr. Trong Python 3+, bạn không cần from __future__ import print_function, đó là chức năng mặc định.
phoenix

Nếu kết xuất một đối tượng, điều này có vẻ hoạt độngpprint(vars(myobject), sys.stderr)
jcroll

25

Chúng tôi cũng có thể sử dụng ghi nhật ký để in dữ liệu trên bảng điều khiển.

Thí dụ:

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)

Thấy điều này nếu bạn không thể có được logger thông tin để làm việc: flask.palletsprojects.com/en/1.0.x/logging
gunslingor

8

Tôi nghĩ vấn đề cốt lõi với Flask là stdout được lưu vào bộ đệm. Tôi đã có thể in với print('Hi', flush=True). Bạn cũng có thể vô hiệu hóa bộ đệm bằng cách đặt PYTHONUNBUFFEREDbiến môi trường (thành bất kỳ chuỗi không trống nào).


Đây là cách tốt nhất để gỡ lỗi in, đặc biệt là trong các dự án nhỏ
learningner0000

Giá trị cần được đặt trong biến env PYTHONUNBUFFERED là gì?
thanos.a

1
@ thanos.a Bạn có thể đặt nó thành bất kỳ chuỗi nào không trống. Tôi đã cập nhật câu trả lời.
Chris

Bạn có thể thêm một ví dụ như PYTHONUNBUFFERED = "anything_here"
thanos.a
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.