2013-07-22 2 views
7

Ho eseguito una semplice applicazione pallone come questo:Come catturare un'eccezione come questa su 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) 

quando l'eseguo e visitare, a volte (non sempre) si could't risposta la richiesta e lanciare un eccezione:

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] 

Non riesco a capire quale causa questa colpa? e come posso risolverlo?

e come posso utilizzare lo try except per catturarlo?

risposta

-3

Probabilmente è dovuto al numero di porta in uso che è 54481 guardando il messaggio di errore. Potrebbe essere in conflitto con qualcos'altro. Suggerisco anche di non utilizzare il parametro use_reloader poiché il DEBUG è già impostato su False. Quindi la bottiglia non ricaricherà le modifiche al codice. Si può invece fare questo:

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

non credo che la vostra risposta è corretta, perché la porta è 54481 il porto di la richiesta (cioè dal browser web). – HolgerSchurig

+1

Tuttavia, per impostazione predefinita, utilizzare la porta 5000: https://github.com/mitsuhiko/flask/blob/master/flask/app.py#L766. Nel tuo esempio la tua app non dovrebbe funzionare con la porta 54481 per il server di sviluppo. – tbicr

+0

FWIW, ho incontrato lo stesso problema, utilizzo una porta personalizzata e ho il debug disattivato. Penso che suggerire un porto diverso sia un'aringa rossa. –

10

ho recentemente imbattuto in questo messaggio di errore durante il tentativo di utilizzare Flask per servire i file audio. Ricevo questo messaggio di errore ogni volta che il client chiude lo stream prima della fine dello stream.

Questo messaggio di errore non ha origine dall'applicazione Flask, ma piuttosto dal SocketServer sottostante utilizzato per inviare i dati di richiesta. Quello che sta accadendo è che la connessione al client sta per finire, ma Flask continua a cercare di scrivere dati nel socket chiuso. Non puoi catturare questa eccezione dall'applicazione Flask, perché Flask la cattura per te. Flask lo stampa come servizio per te, notificandoti che il flusso è stato chiuso prematuramente, vale a dire prima che Flask finisse di scrivere i dati nello stream.

Per riassumere, questo messaggio di errore è interno a Flask, Flask lo sta stampando per dirti che non è stato possibile ottenere tutti i dati sul client prima della chiusura della connessione. Non puoi prenderlo e non dovresti avere alcun motivo per prenderlo.

+2

Questo è corretto. Non si tratta in realtà di un errore di una bottiglia, ma di un errore del server Web interno che non è stato in grado di inviare tutti i dati al client perché la connessione è stata chiusa. Questo può accadere se si preme ricaricare velocemente o interrompere mentre la pagina è ancora in fase di caricamento. Non si dovrebbe utilizzare il server interno in produzione, tutto è a posto. – Bastian

+0

Grazie per questa spiegazione.Mi stava facendo impazzire. Quindi non è un bug, i messaggi sono fastidiosi. @ user305883 Vedo solo un fantasma viola tra un grande 404 quando si fa clic su quel collegamento. – muammar

+0

@muammar https://www.odoo.com/forum/help-1/question/self-sock-sendall-broken-pipe-means-28296 riprova se utile. – user305883

0

Ho trovato questa soluzione come una buona soluzione temporanea.

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

È possibile aggiungere la propria logica di uscita o lasciare il programma con CTRL + \ che invia SIGQUIT. (Importante pallone se si sta eseguendo filettato)

È, tuttavia, non è possibile:

except KeyboardInterupt: 

Perché Flask catture già eccezioni KeyboardInterupt e li gestisce.

errore 10052 significa che si sta utilizzando Windows, in modo da quanto ne so, chiudere la finestra di comando per chiudere il programma

+0

Non pensare che questo errore venga rilevato. –