JavaRush /Курсы /Модуль 4: FastAPI /Интеграция с Google Drive API: как загружать и управлять ...

Интеграция с Google Drive API: как загружать и управлять файлами

Модуль 4: FastAPI
17 уровень , 4 лекция
Открыта

Если коротко, Google Drive API позволяет вашему приложению дружить с Google Диском. Вы можете загружать файлы (не вручную, а по-настоящему, через код), создавать папки, сортировать всё это добро, получать информацию о файлах, искать нужное, удалять и обновлять содержимое — как полноценный админ, но в рамках API.

Зачем это может пригодиться? Представь себе реальное приложение, в котором пользователи хранят резюме, сканы, фотки — всё это нужно где-то хранить. Или, скажем, вы делаете автоматическую синхронизацию документов, резервное копирование, а, может, просто даёте пользователю возможность скачать нужный файл прямо с вашего сервиса.

И вот тут Drive API очень кстати. Он позволяет всё это реализовать гибко и надёжно.


Настройка Google Drive API

Перед тем как кидаться в код, нужно подготовить среду для работы.

Создание проекта в Google Cloud Console

  1. Переходим в Google Cloud Console.
  2. Нажимаем на кнопку "Создать проект".
  3. Указываем имя проекта (например, FastAPI_GoogleDrive_Demo).
  4. После создания переходим в "API и сервисы" → "Библиотека" и включаем Google Drive API.

Настройка сервисного аккаунта

  1. Переходим в "API и сервисы" → "Учётные данные".
  2. Нажимаем "Создать учётные данные" → "Сервисный аккаунт".
  3. Назначаем имя, например drive-service-account, и выбираем роль "Редактор" (Editor).
  4. После создания сервисного аккаунта скачиваем JSON-файл с ключом.
    • Этот JSON-файл понадобится нам для аутентификации в коде.

Права доступа

  1. В Google Drive (через браузер) создайте тестовую папку.
  2. Предоставьте доступ сервисному аккаунту (email из JSON-файла) на уровне этой папки.

Подключение Google Drive API в FastAPI

Для взаимодействия с Google Drive API будем использовать библиотеку google-api-python-client и несколько дополнительных:

pip install google-api-python-client google-auth google-auth-httplib2 google-auth-oauthlib

Эти библиотеки помогут нам настроить аутентификацию и работать с API.

В проекте создаём файл google_drive.py. Этот модуль будет отвечать за интеграцию с Drive:


from google.oauth2 import service_account
from googleapiclient.discovery import build

# Загрузка JSON-файла с ключом
CREDENTIALS_FILE = "path/to/your/credentials.json"

# Настраиваем права доступа для API
SCOPES = ['https://www.googleapis.com/auth/drive']

def build_drive_service():
    # Создаём объект авторизации
    credentials = service_account.Credentials.from_service_account_file(
        CREDENTIALS_FILE, scopes=SCOPES
    )
    # Создаём объект-обёртку для взаимодействия с API
    service = build('drive', 'v3', credentials=credentials)
    return service

Теперь у нас есть функция build_drive_service(), которая возвращает объект для работы с Google Drive API.


Загрузка файлов в Google Drive

Добавим функцию загрузки файла в google_drive.py:


def upload_file(file_name, file_path, mime_type, parent_folder_id=None):
    service = build_drive_service()

    # Формируем метаданные файла
    file_metadata = {
        'name': file_name,
    }
    if parent_folder_id:
        file_metadata['parents'] = [parent_folder_id]

    # Загружаем файл
    media = MediaFileUpload(file_path, mimetype=mime_type)
    uploaded_file = service.files().create(
        body=file_metadata,
        media_body=media,
        fields='id, name'
    ).execute()

    return uploaded_file
  • file_name — имя файла, которое будет отображаться в Drive.
  • file_path — путь к файлу на вашем диске.
  • mime_type — тип файла (например, application/pdf для PDF или image/jpeg для JPEG).
  • parent_folder_id — ID папки, куда будет загружаться файл (опционально).

Добавим эндпоинт для загрузки файлов в main.py:


from fastapi import FastAPI, File, UploadFile
from google_drive import upload_file

app = FastAPI()

@app.post("/upload/")
async def upload_to_drive(file: UploadFile = File(...)):
    # Сохраняем временный файл
    with open(file.filename, "wb") as temp_file:
        temp_file.write(await file.read())

    # Загружаем файл в Google Drive
    uploaded_file = upload_file(
        file_name=file.filename,
        file_path=file.filename,
        mime_type=file.content_type,
    )

    return {"file_id": uploaded_file.get("id"), "name": uploaded_file.get("name")}

Проведём тестирование:

  1. Запустите FastAPI-приложение:
    uvicorn main:app --reload
    
  2. Через Swagger UI (http://127.0.0.1:8000/docs) загрузите файл.
  3. Проверьте, появился ли файл в вашей папке Google Drive.

Управление файлами и папками

Добавим функцию для создания папок в Google Drive:


def create_folder(folder_name, parent_folder_id=None):
    service = build_drive_service()

    folder_metadata = {
        'name': folder_name,
        'mimeType': 'application/vnd.google-apps.folder'
    }
    if parent_folder_id:
        folder_metadata['parents'] = [parent_folder_id]

    folder = service.files().create(
        body=folder_metadata,
        fields='id, name'
    ).execute()

    return folder

Удаление файла или папки:


def delete_file(file_id):
    service = build_drive_service()
    service.files().delete(fileId=file_id).execute()

Теперь у нас есть возможность создавать папки и удалять файлы.


Пример: загрузка файлов в определённую папку

Допустим, мы хотим загружать все файлы в заранее подготовленную папку. Для этого:

  1. Создайте папку в Google Drive и скопируйте её ID.
  2. Используйте parent_folder_id из предыдущих функций.

Пример эндпоинта FastAPI:


@app.post("/upload_to_folder/")
async def upload_file_to_folder(file: UploadFile = File(...), folder_id: str):
    with open(file.filename, "wb") as temp_file:
        temp_file.write(await file.read())

    uploaded_file = upload_file(
        file_name=file.filename,
        file_path=file.filename,
        mime_type=file.content_type,
        parent_folder_id=folder_id
    )

    return {"file_id": uploaded_file.get("id"), "name": uploaded_file.get("name")}

Чек-лист того, что мы узнали

  • Интегрировали Google Drive API с FastAPI.
  • Создали сервисный аккаунт для аутентификации.
  • Разработали функции для загрузки файлов, создания папок и удаления файлов.
  • Реализовали эндпоинты для загрузки файлов в FastAPI-приложении.

Теперь ваше приложение может свободно взаимодействовать с облаком, и вы можете предложить пользователям загружать и хранить их данные в Google Drive. Кто знает, может, это начало создания вашего будущего файлового менеджера?

Для дополнительной информации и справки обратитесь к официальной документации Google Drive API.

1
Задача
Модуль 4: FastAPI, 17 уровень, 4 лекция
Недоступна
Загрузка файла в Google Drive
Загрузка файла в Google Drive
1
Задача
Модуль 4: FastAPI, 17 уровень, 4 лекция
Недоступна
Создание новой директории на Google Drive
Создание новой директории на Google Drive
3
Опрос
Работа с Google API, 17 уровень, 4 лекция
Недоступен
Работа с Google API
Работа с Google API
Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ