Фронтенд¶
🌐 Переклад ШІ та людьми
Цей переклад виконано ШІ під керівництвом людей. 🤝
Можливі помилки через неправильне розуміння початкового змісту або неприродні формулювання тощо. 🤖
Ви можете покращити цей переклад, допомігши нам краще спрямовувати AI LLM.
Ви можете обслуговувати статичні фронтенд-застосунки за допомогою app.frontend() (або router.frontend()).
Це корисно для фронтенд-інструментів, які генерують статичні файли, як-от React з Vite, TanStack Router, Astro, Vue, Svelte, Angular, Solid та інші.
З такими інструментами зазвичай є крок, який збирає фронтенд, командою на кшталт:
npm run build
Це згенерує директорію на кшталт ./dist/ з вашими фронтенд-файлами.
Ви можете використати app.frontend(), щоб обслуговувати цю директорію відповідно до конвенцій, потрібних цим фронтенд-фреймворкам.
FastAPI спочатку перевіряє операції шляху. Фронтенд-файли перевіряються лише тоді, коли жоден звичайний маршрут не збігся, тому ваш API не буде зачеплено.
Обслуговування фронтенду¶
Після збірки вашого фронтенду, наприклад за допомогою npm run build, помістіть згенеровані файли в директорію, наприклад dist.
Структура вашого проєкту може виглядати так:
.
├── pyproject.toml
├── app
│ ├── __init__.py
│ └── main.py
└── dist
├── index.html
└── assets
└── app.js
Потім обслуговуйте її за допомогою app.frontend():
from fastapi import FastAPI
app = FastAPI()
app.frontend("/", directory="dist")
З цим запит до /assets/app.js може обслуговувати dist/assets/app.js.
Якщо у вас також є операція шляху FastAPI, операція шляху має пріоритет.
Маршрутизація на боці клієнта¶
Багато фронтенд-застосунків, включно з односторінковими застосунками (SPA), використовують маршрутизацію на боці клієнта. Шлях на кшталт /dashboard/settings може не бути реальним файлом, але фреймворк подбає про його обробку.
Тому, якщо звертатися до цієї URL-адреси напряму (замість навігації через застосунок), бекенд має обслуговувати фронтенд-застосунок з index.html, щоб фронтенд-фреймворк потім міг обробити маршрутизацію на боці клієнта.
Для цього використовуйте fallback="index.html":
from fastapi import FastAPI
app = FastAPI()
app.frontend("/", directory="dist", fallback="index.html")
FastAPI використовує цей fallback лише для запитів GET і HEAD, які виглядають як навігація браузера. Відсутні файли, як-от JavaScript, CSS і зображення, все ще повертають 404.
Запити з іншими методами, як-от POST або PUT, до шляхів, що збігаються лише з frontend fallback, також повертають 404. Звичайні операції шляху FastAPI все ще мають вищий пріоритет, ніж фронтенд-маршрути.
Порада
За замовчуванням fallback має значення fallback="auto". У більшості випадків вам не потрібно вказувати fallback. Деталі читайте нижче.
Саме це потрібно для багатьох фронтенд-застосунків, які використовують маршрутизацію на боці клієнта, наприклад React з TanStack Router, Vue, Angular, SvelteKit або Solid.
Користувацька сторінка 404¶
Ви також можете обслуговувати статичну сторінку 404.html для відсутніх фронтенд-шляхів:
from fastapi import FastAPI
app = FastAPI()
app.frontend("/", directory="dist", fallback="404.html")
Ця відповідь зберігає код статусу 404.
У цьому випадку FastAPI не буде обслуговувати index.html для відсутніх фронтенд-шляхів. Натомість він поверне файл 404.html.
Порада
За замовчуванням fallback має значення fallback="auto". З ним, якщо файл 404.html знайдено, він буде використаний як fallback автоматично.
Тому зазвичай ви можете не вказувати аргумент fallback.
Це корисно з фронтенд-інструментами, які генерують статичні HTML-файли для кожної сторінки, як-от Astro.
Автоматичний fallback¶
За замовчуванням app.frontend() використовує fallback="auto".
Якщо в директорії фронтенду є файл 404.html, відсутні фронтенд-шляхи обслуговують цей файл з кодом статусу 404.
Інакше, якщо є файл index.html, відсутні шляхи навігації браузера обслуговують index.html, що й очікують багато фронтенд-застосунків з маршрутизацією на боці клієнта.
Отже, у більшості випадків ви можете використовувати app.frontend("/", directory="dist") без вказання аргументу fallback.
from fastapi import FastAPI
app = FastAPI()
app.frontend("/", directory="dist")
Вимкнення fallback¶
Якщо ви не хочете обслуговувати fallback-файл для відсутніх фронтенд-шляхів, використовуйте fallback=None:
from fastapi import FastAPI
app = FastAPI()
app.frontend("/", directory="dist", fallback=None)
Тоді відсутні фронтенд-шляхи повертають звичайний 404.
Перевірка директорії¶
За замовчуванням app.frontend() перевіряє, що директорія існує, коли застосунок створюється.
Це допомагає виявити помилки конфігурації завчасно. Наприклад, якщо директорія вихідних файлів збірки фронтенду відсутня, FastAPI викличе помилку під час запуску.
Якщо ваші фронтенд-файли створюються пізніше, наприклад окремим кроком збірки після створення об'єкта застосунку, встановіть check_dir=False:
from fastapi import FastAPI
app = FastAPI()
app.frontend("/", directory="dist", check_dir=False)
З check_dir=False FastAPI не перевірятиме директорію під час створення застосунку. Якщо налаштована директорія все ще відсутня під час обробки запиту, FastAPI викличе помилку тоді.
Використання з APIRouter¶
Ви також можете додати фронтенд-файли до APIRouter і включити його з префіксом:
from fastapi import APIRouter, FastAPI
app = FastAPI()
router = APIRouter()
router.frontend("/", directory="dist", fallback="index.html")
app.include_router(router, prefix="/app")
У цьому прикладі фронтенд-шляхи обслуговуються під /app.
Будь-які звичайні операції шляху в застосунку все ще матимуть перевагу, включно з операціями в інших роутерах.
Лише статичний результат збірки¶
app.frontend() обслуговує файли, вже згенеровані вашою фронтенд-збіркою.
Він не виконує рендеринг на боці сервера. Він призначений для фронтенд-фреймворків, які генерують статичні файли, а не для фреймворків, що потребують динамічного рендерингу на сервері для кожного запиту.