2

Я пишу скрипт python с помощью apiAPI Google Таблиц. Он считывает данные и записывает их в новый файл, делится этим файлом с указанным адресом электронной почты и возвращает идентификатор нового файла.Почему я получаю ошибку внутреннего сервера 500 из API Google Диска при добавлении пользователей в Лист Google на Python?

def read_sheet(self,spreadsheetId): 
    try: 
     result=self.service.spreadsheets().get(spreadsheetId=spreadsheetId,includeGridData=True,fields='namedRanges,properties,sheets').execute() 
     return result 
    except apiclient.errors.HttpError as e: 
     traceback.print_exc() 
     print(e) 
     sys.exit(1) 

def create_spreadsheet(self,data,email): 
    try: 
     newid=self.service.spreadsheets().create(body=data,fields='spreadsheetId').execute() 
     newid=newid.get('spreadsheetId') 
     self.give_permissions(email,newid) 
     return newid 
    except apiclient.errors.HttpError as e: 
     traceback.print_exc() 
     print(e) 
     sys.exit(1) 

Этот код работает очень хорошо, но не со 100% -ной точностью. Иногда я получаю 500 Internal Server Error, но файл создается в моей учетной записи. Я нашел аналогичный вопрос переполнения стека (Getting 500 Error when using Google Drive API to update permissions), но это не помогло. Я хочу знать точную причину этого. Может ли кто-нибудь помочь?

EDIT1:

Это точное сообщение об ошибке

https://www.googleapis.com/drive/v3/files/349hsadfhSindfSIins-rasdfisadfOsa3OQmE/permissions?sendNotificationEmail=true & альт = & transferOwnership JSON = ложь возвращается «внутренняя ошибка сообщение пользователя:.„внутренняя ошибка произошла, которые предотвратили доступ к элементу (ы): Шаблон“»>

+0

Внутренняя ошибка сервера - защита от наводнений. Вы собираетесь поститься, вы должны реализовать какой-то экспоненциальный откат https://en.wikipedia.org/wiki/Exponential_backoff – DaImTo

+0

Как его реализовать [email protected] –

+0

Извините, я не эксперт по python. Попробуйте Googling для этого Я нашел это http://stackoverflow.com/q/27438273/1841839 – DaImTo

ответ

0

Как указано выше в комментарии DaimTo, ошибка связана с тем, что Google Диск по-прежнему обрабатывает запрос создания, пока вы пытаетесь добавить разрешение на совместное использование (нового) файла. Помните, что когда вы добавляете файл на диск, серверы Google по-прежнему работают над созданием файла, а также делают его доступным по всему миру. После того, как возникнет волна активности, добавление дополнительных пользователей в документ не должно быть проблемой.

Вы можете видеть из this Drive API documentation page описания (500) ошибку вы получили, а также рекомендуемый курс действий, который должен осуществить экспоненциальную отсрочку, которая на самом деле просто говорит, что вы должны сделать паузу немного, прежде чем снова пытаться & расширения, что задержка каждый раз, когда вы получаете ту же ошибку. Он также указал на another SO Q&A, на который вы можете посмотреть. Другой ресурс - это описательный блог post. Если вы не хотите его реализовывать самостоятельно, вы можете попробовать пакеты retrying или backoff.

ПРИМЕЧАНИЕ. Вы не указали нам весь свой код, но я изменил название этого вопроса, чтобы более точно отразить, что вы используете Drive API для добавления разрешений. В то время как вы использовали Sheets API для создания Листа с, понимаете, что вы можете просто сделать все это с помощью API-интерфейса Drive (а не использовать API-интерфейсы вообще, если вы не выполняете операции с таблицами). API-интерфейс Drive для всех связанные с файлами, такие как совместное использование, копирование, импорт/экспорт и т. д.)

В нижней строке вы можете создавать листы, используя API, но если вы ничего не делаете с API-интерфейсом, зачем беспокоиться о том, приложение сложнее? Если вы хотите увидеть, как создавать листы с обоими API-интерфейсами, в моем blog post есть короткий сегмент, который охватывает это ... вы увидите, что они почти идентичны, но использование Drive API требует еще одной вещи: MIMEtype.

Если вы хотите узнать больше о обеих API, см this answer I gave to a related question, который показывает дополнительные ресурсы обучения я создал для обоих Drive и листов, большинство из которых являются Python основы.