У цій лекції ми зробимо міні-додаток на 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"). - Додати можливість читання даних у окремому ендпоінті.
- Валідація даних перед записом для запобігання некоректного вводу.
- Створення логів для відстеження всіх операцій.
Корисні ресурси
Тепер у вас є робоча інтеграція FastAPI і Google Sheets,
яку можна використовувати як основу для побудови більш складних додатків.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ