Я настраиваю приложение 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 на моем ноутбуке.
Существует ли чистый способ получить то, что я хочу, с помощью авторизации учетной записи службы?