2

Google 스프레드 시트 apiAPI를 사용하여 python 스크립트를 작성하고 있습니다. 데이터를 읽고 새 파일에 쓰고 지정된 이메일과 파일을 공유하며 새 파일의 ID를 반환합니다.Python으로 Google 스프레드 시트에 사용자를 추가 할 때 Google 드라이브 API에서 500 개의 내부 서버 오류가 발생하는 이유는 무엇입니까?

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 내부 서버 오류가 발생하지만 내 계정에 파일이 만들어집니다. 비슷한 스택 오버 플로우 질문 (Getting 500 Error when using Google Drive API to update permissions)을 발견했지만 도움이되지 않았습니다. 나는이 정확한 이유를 알고 싶다. 누구든지 도와 줄 수 있습니까?

EDIT1 :

이 정확한 오류 메시지입니다

https://www.googleapis.com/drive/v3/files/349hsadfhSindfSIins-rasdfisadfOsa3OQmE/permissions?sendNotificationEmail=true & 고도 = JSON & transferOwnership = 거짓 가. "내부 오류 사용자 메시지 :"반환 내부 오류가 은 다음 항목을 공유 방지하는 발생했습니다 템플릿 "">

+0

내부 서버 오류는 홍수 방지입니다. 당신은 빨리하려고합니다. 어떤 종류의 Exponential 백 오프를 구현해야합니다. https://en.wikipedia.org/wiki/Exponential_backoff – DaImTo

+0

어떻게 구현해야합니까[email protected] –

+0

죄송합니다. 저는 파이썬 전문가가 아닙니다. 그것을 위해 인터넷 검색을 시도해보십시오. 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를 전혀 사용하지 않고 드라이브 API를 사용하여이 모든 작업을 수행 할 수 있습니다 .Drive API는 복사, 가져 오기/내보내기 등과 같은 파일 관련 작업)

중요한 점은 두 API 중 하나를 사용하여 스프레드 시트를 만들 수 있지만 스프레드 시트 API로 다른 작업을 수행하지 않는다면 앱이 더 복잡해 졌나요? 두 API를 사용하여 스프레드 시트를 만드는 방법을보고 싶다면 내 blog post에있는 짧은 세그먼트가 있습니다. 거의 동일하지만 드라이브 API를 사용하면 MIMEtype이 하나 더 필요합니다.

당신이 두 API에 대한 자세한 내용을 원한다면, 나는 드라이브 와 파이썬 기반으로 대부분의 시트, 모두를 위해 만든 추가 학습 자료를 제공 this answer I gave to a related question를 참조하십시오.

관련 문제