2013-04-03 10 views
5

L'API REST di Google Drive a volte restituisce un errore di 500: Internal Server quando si tenta di caricare un file. La maggior parte di questi errori corrisponde effettivamente a un caricamento riuscito. Riprova il caricamento secondo le raccomandazioni di Google solo per vedere i duplicati in seguito.Google Drive SDK - 500: errore interno del server: caricamento file con esito positivo la maggior parte del tempo

Qual è il modo consigliato di consegnare questi errori?

risposta

-2

la gestione degli errori standard viene descritto qui: https://developers.google.com/drive/handle-errors

Tuttavia, 500 errori non dovrebbero mai accadere, quindi si prega di aggiungere le informazioni di log, e Google può guardare per il debug di questo problema per voi. Grazie.

+0

Registrerò l'intera risposta quando avrò un 500 e rispondo quando ne trovo uno. – Rajiv

+0

Vota per questo - lo stesso problema qui http://stackoverflow.com/questions/19769000/google-drive-uploading-file-size-limit –

+0

Risolto per me - vedi il mio commento precedente. Controlla il tuo mime-type e prova a caricare i tuoi file con Content-Type: applicatio/octet-stream. GoogleDrive non riesce a volte con la conversione dei file. –

0

Google's documentation sembra indicare che si tratta di un errore interno e non di un errore specifico che è possibile correggere. Suggeriscono di utilizzare exponential backoff, che sostanzialmente sta riprovettando la funzione a intervalli crescenti.

Ad esempio, la funzione non riesce. Attendi 2 secondi e riprova. Se fallisce, aspetta 4 secondi. Poi 8 secondi, 16, 32 ecc. Gli spazi più grandi significano che stai dando sempre più tempo per il servizio a se stesso. Anche se, a seconda delle esigenze, potresti voler limitare il tempo alla fine in modo che resti in attesa per un massimo di 10 minuti prima di fermarsi.

Il pacchetto retrying ha una configurazione molto buona per questo. Puoi solo from retrying import retry e quindi utilizzare retry come decoratore su qualsiasi funzione che dovrebbe essere tentata di nuovo. Ecco un esempio di mine:

@retry(wait_exponential_multiplier=1000, wait_exponential_max=60*1000, stop_max_delay=10*60*1000) 
def find_file(name, parent=''): 
    ... 

Per utilizzare il decoratore non vi resta che mettere @retry prima della dichiarazione di funzione. Potresti semplicemente usare retry() ma ci sono dei parametri opzionali che puoi passare per regolare come funziona la sincronizzazione. Io uso wait_exponential_multiplier per regolare l'aumento del tempo di attesa tra i tentativi. wait_exponential_max è il tempo massimo che può trascorrere in attesa tra i tentativi. E stop_max_delay è il tempo che impiegherà a riprovare prima che sollevi l'eccezione. Tutti i loro valori sono in millisecondi.

Problemi correlati