Google Drive API - проблемы с загрузкой файлов из учетной записи службы - PullRequest
0 голосов
/ 17 апреля 2020

Я настраиваю приложение Django -Heroku, чтобы пользователи могли загружать видео (не более 75 МБ). Я попробовал это двумя способами сейчас, и ни один из них не работает так, как я хочу, поэтому я хотел бы знать, нарушаю ли я какое-то ограничение или просто не выполняю его должным образом.

Среда
У меня есть учетная запись G Suite с учетной записью службы с полномочиями делегата. Клавиша JSON на месте, API включен, учетная запись авторизована с соответствующими областями, и я могу загружать файлы.

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

class GoogleDrive():

  service = 'drive'
  version = 'v3'
  permissions = ['read'] # Converts to "readonly" scope
  connection = connect() # Calls build() with appropriate scope / credentials

Попытка 1 - загрузите файл GD и верните как HTTPResponse

# Get GD service
gd = GoogleDrive()

request = gd.connection.files().get_media(fileId='<SOME_ID>')
stream = io.BytesIO()
downloader = MediaIoBaseDownload(stream, request)
done = False

# Get file in chunks
for retry in range(0, 5):
  while done is False:
    status, done = downloader.next_chunk()

# Build response
response = HttpResponse(stream.getvalue(), content_type=<SOME_CONTENT_TYPE>)
response['Content-Disposition'] = 'attachment; filename=sample.mp4' % # force download
response['Content-Length'] = <FILE_SIZE>

return response

От пользователя вид, это то, что я хочу - один клик и загрузка файла. Но я чувствую, что файл обрабатывается дважды - один раз, чтобы передать его с Google Drive на сервер приложений, и второй раз, чтобы отправить его пользователю. Это работает, но это занимает некоторое время, и я чувствую, что это израсходует ресурсы веб-сервера.

Попытка 2 - вернуть URL перенаправления для загрузки файла GD

# Get GD service
gd = GoogleDrive()

# Get file content URL
fileinfo = gd.connection.files().get(fileId=<SOME_ID>, fields='webContentLink').execute()
fileurl = fileinfo['webContentLink']

return redirect(fileurl)

Это также близко к тому, что я хочу, но если я не вошел в Учетная запись G Suite, я получаю сообщение об ошибке 403 на своем мобильном телефоне или запрос входа в Google на моем ноутбуке.

Существует ли чистый способ получить то, что я хочу, с помощью авторизации учетной записи службы?

...