В этой лекции мы создадим мини-приложение на FastAPI, которое будет:
- Принимать от пользователя данные через POST-запрос.
- Записывать эти данные в Google Sheet.
- Убедимся, что всё работает гладко и безопасно: настроим валидацию данных, а также разграничим доступ.
Каждый этап будет сопровождаться кодом, комментариями и пояснениями.
И да, в конце — у вас на руках будет приложение, которое можно продемонстрировать на собеседовании.
Подготовка к работе
Если вы ещё не создали Google Cloud проект и сервисный аккаунт для доступа к Google Sheets API — настоятельно рекомендую вернуться к лекции 72 и 74. Вам понадобятся:
- JSON-файл с ключами сервисного аккаунта.
- Доступ к Google Sheet (создайте любую таблицу вручную для демонстрации).
Для более детальной информации по Google Sheets API — обратитесь к официальной документации.
Установка библиотек
Наше приложение потребует нескольких библиотек. Убедитесь, что у вас установлены:
fastapiдля создания API.httpxдля асинхронных запросов.google-authиgoogle-auth-oauthlibдля работы с авторизацией.google-api-python-clientдля взаимодействия с Google Sheets API.
Установим всё через pip:
pip install fastapi httpx google-auth google-auth-oauthlib google-api-python-client uvicorn
Теперь у вас есть все инструменты. Время кодить!
Настройки Google Sheets API
Создайте в папке проекта файл settings.py и добавьте туда настройки для проекта:
# settings.py
SERVICE_ACCOUNT_FILE = "path/to/your/service_account.json" # Укажите путь к JSON с ключами
SPREADSHEET_ID = "your-spreadsheet-id" # ID таблицы Google Sheets
Откройте Google Sheets в браузере, скопируйте часть URL между /d/ и /edit.
Создание FastAPI-приложения
Приступим к созданию FastAPI-приложения. Начнём с базовой структуры.
Базовый проект: main.py
from fastapi import FastAPI
from google.oauth2.service_account import Credentials
from googleapiclient.discovery import build
# Импортируем настройки
from settings import SERVICE_ACCOUNT_FILE, SPREADSHEET_ID
# Инициализация приложения
app = FastAPI()
# Настраиваем авторизацию с использованием сервисного аккаунта
credentials = Credentials.from_service_account_file(SERVICE_ACCOUNT_FILE)
service = build('sheets', 'v4', credentials=credentials)
@app.get("/")
def root():
return {"message": "Добро пожаловать в API для работы с Google Sheets!"}
Запустите приложение командой:
uvicorn main:app --reload
И проверьте в браузере: http://127.0.0.1:8000 — вы должны увидеть сообщение. Базовая настройка готова.
Реализация записи данных в Google Sheet
Теперь создадим эндпоинт (/add-data), который будет принимать данные и записывать их в Google Sheet. Для демонстрации мы предположим, что пользователь отправляет JSON с полями name и age.
Код для добавления данных
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from googleapiclient.errors import HttpError
# Импортируем всё из базового примера
from settings import SERVICE_ACCOUNT_FILE, SPREADSHEET_ID
from google.oauth2.service_account import Credentials
from googleapiclient.discovery import build
# Обновляем приложение
app = FastAPI()
credentials = Credentials.from_service_account_file(SERVICE_ACCOUNT_FILE)
service = build('sheets', 'v4', credentials=credentials)
# Модель данных для валидации
class UserData(BaseModel):
name: str
age: int
@app.post("/add-data")
async def add_data(user_data: UserData):
"""
Эндпоинт для добавления данных в Google Sheet.
"""
try:
# Формируем запрос для записи данных
values = [[user_data.name, user_data.age]]
body = {
'values': values
}
result = service.spreadsheets().values().append(
spreadsheetId=SPREADSHEET_ID,
range='Sheet1!A1:B1', # Указываем диапазон (A1:B1 для простоты)
valueInputOption='RAW',
body=body
).execute()
return {"status": "success", "updatedCells": result.get('updates').get('updatedCells')}
except HttpError as e:
raise HTTPException(status_code=500, detail=f"Ошибка при работе с Google API: {e}")
Отлично, давайте проверим, как это работает.
Тестирование эндпоинта
- Откройте Postman, Curl или любой другой инструмент.
- Отправьте POST-запрос на эндпоинт
http://127.0.0.1:8000/add-dataсо следующим телом запроса:
{
"name": "Иван Иванов",
"age": 25
}
- Проверьте таблицу Google Sheets. Данные должны появиться в первых двух колонках (A и B).
Разграничение прав доступа
Для безопасности вы можете дополнительно разграничить доступ, добавив JWT-токены или ограничив IP-адреса, которые могут вызывать API.
Мы рассмотрим это в следующих лекциях (см. темы по JWT и OAuth2).
Расширение функциональности
Наше приложение работает, но что если пользователь захочет добавить ещё столбцы? Или у нас будут сложные таблицы
Вот некоторые идеи для улучшения:
- Указывать диапазон в запросе (например,
range="Sheet1!A1:D1"). - Добавить возможность чтения данных в отдельном эндпоинте.
- Валидация данных перед записью для предотвращения некорректного ввода.
- Создание логов для отслеживания всех операций.
Полезные ресурсы
- Официальная документация Google Sheets API
- FastAPI Documentation
- Документация Google API Python Client
Теперь у вас есть рабочая интеграция FastAPI и Google Sheets,
которую можно использовать как основу для построения более сложных приложений.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ