2013-07-22 46 views
7

tôi chạy một ứng dụng bình đơn giản như thế này:Làm thế nào để bắt một ngoại lệ như thế này trên Flask?

from flask import Flask 

app = Flask(__name__) 

@app.route('/') 
def welcome(): 
    return "OK" 


app.config.update(
    DEBUG = True 
) 

if __name__ == '__main__': 
    app.run(use_reloader = False) 

khi tôi chạy nó và truy cập vào nó, đôi khi (không phải luôn luôn) nó could't đáp ứng yêu cầu và ném một ngoại trừ:

Exception happened during processing of request from ('127.0.0.1', 54481) 
Traceback (most recent call last): 
    File "c:\python27\Lib\SocketServer.py", line 295, in _handle_request_noblock 
    self.process_request(request, client_address) 
    File "c:\python27\Lib\SocketServer.py", line 321, in process_request 
    self.finish_request(request, client_address) 
    File "c:\python27\Lib\SocketServer.py", line 334, in finish_request 
    self.RequestHandlerClass(request, client_address, self) 
    File "c:\python27\Lib\SocketServer.py", line 651, in __init__ 
    self.finish() 
    File "c:\python27\Lib\SocketServer.py", line 710, in finish 
    self.wfile.close() 
    File "c:\python27\Lib\socket.py", line 279, in close 
    self.flush() 
    File "c:\python27\Lib\socket.py", line 303, in flush 
    self._sock.sendall(view[write_offset:write_offset+buffer_size]) 
error: [Errno 10053] 

Tôi không thể hiểu được nguyên nhân gây ra lỗi này? và làm thế nào tôi có thể giải quyết nó?

và làm cách nào tôi có thể sử dụng try except để xem?

Trả lời

-3

Có thể do số cổng đang được sử dụng là 54481 bằng cách xem thông báo lỗi của bạn. Nó có thể đụng độ với cái gì khác. Tôi cũng khuyên bạn không nên sử dụng tham số use_reloader vì DEBUG của bạn đã được đặt thành Sai. Vì vậy, bình sẽ không tải lại bất kỳ thay đổi mã nào. Thay vào đó, bạn có thể thực hiện việc này:

if __name__ == '__main__': 
    app.run(port=5000) 
+3

Tôi không nghĩ câu trả lời của bạn là chính xác, vì cổng 54481 là cổng yêu cầu (tức là từ trình duyệt web). – HolgerSchurig

+1

Nhưng theo mặc định, sử dụng bình 5000 cổng: https://github.com/mitsuhiko/flask/blob/master/flask/app.py#L766. Trong ví dụ của bạn, ứng dụng của bạn sẽ không hoạt động với cổng 54481 cho máy chủ dev. – tbicr

+0

FWIW, tôi đã chạy vào cùng một vấn đề, tôi sử dụng một cổng tùy chỉnh và tôi đã gỡ lỗi tắt. Tôi nghĩ rằng việc gợi ý một cảng khác là cá trích đỏ. –

10

Gần đây tôi đã gặp thông báo lỗi này trong khi cố gắng sử dụng Flask để phân phát tệp âm thanh. Tôi nhận được thông báo lỗi này bất cứ khi nào khách hàng đóng luồng trước khi kết thúc luồng.

Thông báo lỗi này không bắt nguồn từ ứng dụng Flask của bạn, mà đúng hơn là từ SocketServer bên dưới được sử dụng để gửi dữ liệu yêu cầu. Điều gì đang xảy ra là kết nối với máy khách đang kết thúc vì một lý do nào đó, nhưng Flask tiếp tục cố gắng ghi dữ liệu vào ổ cắm đã đóng. Bạn không thể bắt ngoại lệ này từ ứng dụng Flask của bạn, bởi vì Flask bắt nó cho bạn. Flask in ra dưới dạng dịch vụ cho bạn, thông báo cho bạn rằng luồng đã bị đóng sớm, tức là trước khi Flask hoàn tất ghi dữ liệu vào luồng.

Để tổng hợp, thông báo lỗi này nằm trong Flask, Flask đang in nó để cho bạn biết rằng nó không thể lấy tất cả dữ liệu cho máy khách trước khi kết nối đóng. Bạn không thể nắm bắt nó, và bạn không nên có bất kỳ lý do để bắt nó.

+2

Đúng vậy. Nó không thực sự là một lỗi bình, nhưng một lỗi của máy chủ web nội bộ mà nó không thể gửi tất cả dữ liệu cho khách hàng vì kết nối đã được đóng lại. Điều này có thể xảy ra nếu bạn nhấn tải lại nhanh hoặc dừng trong khi trang vẫn đang tải. Bạn không nên sử dụng máy chủ nội bộ trong sản xuất, mọi thứ đều ổn. – Bastian

+0

Cảm ơn lời giải thích này.Nó khiến tôi phát điên. Vì vậy, nó không phải là một lỗi, khó khăn các tin nhắn được gây phiền nhiễu. @ user305883 Tôi chỉ thấy một con ma màu tím giữa một 404 lớn khi nhấp vào liên kết đó. – muammar

+0

@muammar https://www.odoo.com/forum/help-1/question/self-sock-sendall-broken-pipe-means-28296 thử lại nếu hữu ích. – user305883

0

Tôi đã tìm thấy giải pháp này là một giải pháp khắc phục ít nhất là tạm thời.

if __name__ == '__main__': 
    while True: 
    try: 
     app.run(use_reloader = False) 
    except: 
     pass 

Bạn có thể thêm logic thoát của riêng mình hoặc rời khỏi chương trình bằng CTRL + \ gửi SIGQUIT. (Quan trọng nếu bạn đang chạy bình ren)

Tuy nhiên bạn không thể:

except KeyboardInterupt: 

Vì Flask đã bắt ngoại lệ KeyboardInterupt và xử lý chúng.

lỗi 10052 có nghĩa là bạn đang sử dụng cửa sổ, như tôi biết, hãy đóng cửa sổ lệnh để thoát khỏi chương trình

+0

Đừng nghĩ rằng điều này bắt lỗi này. –