Если коротко, Google Drive API позволяет вашему приложению дружить с Google Диском. Вы можете загружать файлы (не вручную, а по-настоящему, через код), создавать папки, сортировать всё это добро, получать информацию о файлах, искать нужное, удалять и обновлять содержимое — как полноценный админ, но в рамках API.
Зачем это может пригодиться? Представь себе реальное приложение, в котором пользователи хранят резюме, сканы, фотки — всё это нужно где-то хранить. Или, скажем, вы делаете автоматическую синхронизацию документов, резервное копирование, а, может, просто даёте пользователю возможность скачать нужный файл прямо с вашего сервиса.
И вот тут Drive API очень кстати. Он позволяет всё это реализовать гибко и надёжно.
Настройка Google Drive API
Перед тем как кидаться в код, нужно подготовить среду для работы.
Создание проекта в Google Cloud Console
- Переходим в Google Cloud Console.
- Нажимаем на кнопку "Создать проект".
- Указываем имя проекта (например,
FastAPI_GoogleDrive_Demo). - После создания переходим в "API и сервисы" → "Библиотека" и включаем Google Drive API.
Настройка сервисного аккаунта
- Переходим в "API и сервисы" → "Учётные данные".
- Нажимаем "Создать учётные данные" → "Сервисный аккаунт".
- Назначаем имя, например
drive-service-account, и выбираем роль "Редактор" (Editor). - После создания сервисного аккаунта скачиваем JSON-файл с ключом.
- Этот JSON-файл понадобится нам для аутентификации в коде.
Права доступа
- В Google Drive (через браузер) создайте тестовую папку.
- Предоставьте доступ сервисному аккаунту (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")}
Проведём тестирование:
- Запустите FastAPI-приложение:
uvicorn main:app --reload - Через Swagger UI (http://127.0.0.1:8000/docs) загрузите файл.
- Проверьте, появился ли файл в вашей папке 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()
Теперь у нас есть возможность создавать папки и удалять файлы.
Пример: загрузка файлов в определённую папку
Допустим, мы хотим загружать все файлы в заранее подготовленную папку. Для этого:
- Создайте папку в Google Drive и скопируйте её ID.
- Используйте
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.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ