Co-authored-by: pr-submit[bot] <pr-submit[bot]@users.noreply.github.com> Co-authored-by: Yurii Motov <109919500+YuriiMotov@users.noreply.github.com> Co-authored-by: pr-push[bot] <pr-push[bot]@users.noreply.github.com>
11 KiB
Frontend
рдЖрдк app.frontend() (рдпрд╛ router.frontend()) рдХреЗ рд╕рд╛рде static frontend apps serve рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдпрд╣ рдЙрди frontend tools рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИ рдЬреЛ static files generate рдХрд░рддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ React with Vite, TanStack Router, Astro, Vue, Svelte, Angular, Solid, рдФрд░ рдЕрдиреНрдпред
рдЗрди tools рдХреЗ рд╕рд╛рде, рдЖрдкрдХреЗ рдкрд╛рд╕ рдЖрдорддреМрд░ рдкрд░ рдПрдХ step рд╣реЛрддрд╛ рд╣реИ рдЬреЛ frontend рдХреЛ build рдХрд░рддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдЗрд╕ command рдХреЗ рд╕рд╛рде:
npm run build
рдпрд╣ рдЖрдкрдХреЗ frontend files рдХреЗ рд╕рд╛рде ./dist/ рдЬреИрд╕реА рдПрдХ directory generate рдХрд░реЗрдЧрд╛ред
рдЖрдк рдЙрд╕ directory рдХреЛ рдЗрди frontend frameworks рдХреЗ рд▓рд┐рдП required conventions рдХреЗ рдЕрдиреБрд╕рд╛рд░ serve рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП app.frontend() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
FastAPI рдкрд╣рд▓реЗ path operations рдХреА рдЬрд╛рдБрдЪ рдХрд░рддрд╛ рд╣реИред frontend files рдХреА рдЬрд╛рдБрдЪ рдХреЗрд╡рд▓ рддрдм рдХреА рдЬрд╛рддреА рд╣реИ рдЬрдм рдХреЛрдИ рд╕рд╛рдорд╛рдиреНрдп route match рдирд╣реАрдВ рд╣реБрдЖ рд╣реЛ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреА API рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рд╣реЛрдЧреАред
Frontend Serve рдХрд░реЗрдВ
рдЕрдкрдирд╛ frontend build рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП npm run build рдХреЗ рд╕рд╛рде, generate рдХреА рдЧрдИ files рдХреЛ рдХрд┐рд╕реА directory рдореЗрдВ рд░рдЦреЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, distред
рдЖрдкрдХреА project рд╕рдВрд░рдЪрдирд╛ рдРрд╕реА рджрд┐рдЦ рд╕рдХрддреА рд╣реИ:
.
тФЬтФАтФА pyproject.toml
тФЬтФАтФА app
тФВ тФЬтФАтФА __init__.py
тФВ тФФтФАтФА main.py
тФФтФАтФА dist
тФЬтФАтФА index.html
тФФтФАтФА assets
тФФтФАтФА app.js
рдлрд┐рд░ рдЗрд╕реЗ app.frontend() рдХреЗ рд╕рд╛рде serve рдХрд░реЗрдВ:
{* ../../docs_src/frontend/tutorial001_py310.py hl[5] *}
рдЗрд╕рдХреЗ рд╕рд╛рде, /assets/app.js рдХреЗ рд▓рд┐рдП рдПрдХ request dist/assets/app.js serve рдХрд░ рд╕рдХрддреА рд╣реИред
рдЕрдЧрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ FastAPI path operation рднреА рд╣реИ, рддреЛ path operation рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдорд┐рд▓рддреА рд╣реИред
Client-Side Routing
рдХрдИ frontend apps, рдЬрд┐рдирдореЗрдВ single-page apps (SPAs) рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, client-side routing рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред /dashboard/settings рдЬреИрд╕рд╛ path рдЕрд╕рд▓реА file рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди framework рдЗрд╕реЗ handle рдХрд░рдиреЗ рдХрд╛ рдзреНрдпрд╛рди рд░рдЦреЗрдЧрд╛ред
рдЗрд╕рд▓рд┐рдП, рдЕрдЧрд░ рдЙрд╕ URL рдХреЛ рд╕реАрдзреЗ access рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ (app рдХреЗ рдЕрдВрджрд░ navigate рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп), рддреЛ backend рдХреЛ frontend app рдХреЛ index.html рд╕реЗ serve рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рддрд╛рдХрд┐ frontend framework рдлрд┐рд░ client-side routing рдХреЛ handle рдХрд░ рд╕рдХреЗред
рдЗрд╕рдХреЗ рд▓рд┐рдП, fallback="index.html" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:
{* ../../docs_src/frontend/tutorial002_py310.py hl[5] *}
FastAPI рдЗрд╕ fallback рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рдЙрди GET рдФрд░ HEAD requests рдХреЗ рд▓рд┐рдП рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ Accept: text/html рдпрд╛ Accept: application/xhtml+xml рдХреЗ рд╕рд╛рде HTML accept рдХрд░рддреА рд╣реИрдВ, рдЬреИрд╕рд╛ browser navigation requests рд╕рд╛рдорд╛рдиреНрдпрддрдГ рдХрд░рддреА рд╣реИрдВред JavaScript, CSS, рдФрд░ images рдЬреИрд╕реА missing files рдЕрднреА рднреА 404 рд▓реМрдЯрд╛рддреА рд╣реИрдВред
рдЕрдиреНрдп methods рд╡рд╛рд▓реА requests, рдЬреИрд╕реЗ POST рдпрд╛ PUT, рдЙрди paths рдкрд░ рдЬреЛ рдХреЗрд╡рд▓ frontend fallback рд╕реЗ match рдХрд░рддреЗ рд╣реИрдВ, рд╡реЗ рднреА 404 рд▓реМрдЯрд╛рддреА рд╣реИрдВред рдирд┐рдпрдорд┐рдд FastAPI path operations рдХреА priority рдЕрднреА рднреА frontend routes рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛрддреА рд╣реИред
/// tip | рд╕реБрдЭрд╛рд╡
Default рд░реВрдк рд╕реЗ, fallback рдХреА value fallback="auto" рд╣реЛрддреА рд╣реИред рдЕрдзрд┐рдХрддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЖрдкрдХреЛ fallback specify рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реЛрдЧреАред рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП рдиреАрдЪреЗ рдкрдврд╝реЗрдВред
///
рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рдЖрдк рдХрдИ frontend apps рдХреЗ рд╕рд╛рде рдЪрд╛рд╣реЗрдВрдЧреЗ рдЬреЛ client-side routing рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, React with TanStack Router, Vue, Angular, SvelteKit, рдпрд╛ Solidред
Custom 404 Page
рдЖрдк missing frontend paths рдХреЗ рд▓рд┐рдП static 404.html page рднреА serve рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
{* ../../docs_src/frontend/tutorial003_py310.py hl[5] *}
рд╡рд╣ response 404 рдХрд╛ status code рдмрдирд╛рдП рд░рдЦрддреА рд╣реИред
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, FastAPI missing frontend paths рдХреЗ рд▓рд┐рдП index.html serve рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдпрд╣ 404.html file рд▓реМрдЯрд╛рдПрдЧрд╛ред
/// tip | рд╕реБрдЭрд╛рд╡
Default рд░реВрдк рд╕реЗ, fallback рдХреА value fallback="auto" рд╣реЛрддреА рд╣реИред рдЗрд╕рдХреЗ рд╕рд╛рде, рдЕрдЧрд░ 404.html file рдорд┐рд▓рддреА рд╣реИ, рддреЛ рдЙрд╕реЗ рдЕрдкрдиреЗ-рдЖрдк fallback рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдЗрд╕рд▓рд┐рдП, рдЖрдк рд╕рд╛рдорд╛рдиреНрдпрддрдГ fallback argument рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред
///
рдпрд╣ рдЙрди frontend tools рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧреА рд╣реИ рдЬреЛ рд╣рд░ page рдХреЗ рд▓рд┐рдП static HTML files generate рдХрд░рддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ Astroред
Fallback Auto
Default рд░реВрдк рд╕реЗ, app.frontend() fallback="auto" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
рдЕрдЧрд░ frontend directory рдореЗрдВ 404.html file рд╣реИ, рддреЛ missing frontend paths рдЙрд╕ file рдХреЛ status code 404 рдХреЗ рд╕рд╛рде serve рдХрд░рддреЗ рд╣реИрдВред
рдЕрдиреНрдпрдерд╛, рдЕрдЧрд░ index.html file рд╣реИ, рддреЛ missing browser navigation paths index.html serve рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ client-side routing рд╡рд╛рд▓реЗ рдХрдИ frontend apps рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВред
рдЗрд╕рд▓рд┐рдП, рдЕрдзрд┐рдХрддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЖрдк fallback argument specify рдХрд┐рдП рдмрд┐рдирд╛ app.frontend("/", directory="dist") рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
{* ../../docs_src/frontend/tutorial001_py310.py hl[5] *}
Fallback рдмрдВрдж рдХрд░реЗрдВ
рдЕрдЧрд░ рдЖрдк missing frontend paths рдХреЗ рд▓рд┐рдП fallback file serve рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ, рддреЛ fallback=None рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:
{* ../../docs_src/frontend/tutorial005_py310.py hl[5] *}
рдлрд┐рд░ missing frontend paths рд╕рд╛рдорд╛рдиреНрдп 404 рд▓реМрдЯрд╛рддреЗ рд╣реИрдВред
Directory рдЬрд╛рдБрдЪреЗрдВ
Default рд░реВрдк рд╕реЗ, app.frontend() check_dir="auto" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
рдЬрдм FASTAPI_ENV environment variable рдХреЛ development рдкрд░ set рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЕрдЧрд░ frontend build output directory missing рд╣реИ рддреЛ FastAPI рдХреЗрд╡рд▓ рдПрдХ warning рджрд┐рдЦрд╛рддрд╛ рд╣реИред fastapi dev command рдЖрдкрдХреЗ рд▓рд┐рдП рдпрд╣ environment variable set рдХрд░рддрд╛ рд╣реИ рдЕрдЧрд░ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ set рдирд╣реАрдВ рд╣реИред рдпрд╣ рдЖрдкрдХреЛ development рдХреЗ рджреМрд░рд╛рди frontend рдХреЛ build рдпрд╛ start рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ backend start рдХрд░рдиреЗ рджреЗрддрд╛ рд╣реИред
рдХрд┐рд╕реА рднреА рдЕрдиреНрдп environment рдореЗрдВ, app рдмрдирд╛рдП рдЬрд╛рдиреЗ рдкрд░ FastAPI error raise рдХрд░рддрд╛ рд╣реИред рдпрд╣ frontend files рдХреЗ рдмрд┐рдирд╛ app deploy рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ configuration errors рдХреЛ рдЬрд▓реНрджреА рдкрдХрдбрд╝рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред
рдЖрдк app рдмрдирд╛рдП рдЬрд╛рдиреЗ рдкрд░ рд╣рдореЗрд╢рд╛ directory рдХреА рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП check_dir=True рднреА set рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЕрдЧрд░ рдЖрдкрдХреА frontend files рдмрд╛рдж рдореЗрдВ рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП app object рдмрдирдиреЗ рдХреЗ рдмрд╛рдж рдХрд┐рд╕реА рдЕрд▓рдЧ build step рджреНрд╡рд╛рд░рд╛, рддреЛ check_dir=False set рдХрд░реЗрдВ:
{* ../../docs_src/frontend/tutorial006_py310.py hl[5] *}
check_dir=False рдХреЗ рд╕рд╛рде, FastAPI app рдмрдирд╛рддреЗ рд╕рдордп directory рдХреА рдЬрд╛рдБрдЪ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рдЕрдЧрд░ configured directory рдХрд┐рд╕реА request рдХреЛ handle рдХрд░рддреЗ рд╕рдордп рдЕрднреА рднреА missing рд╣реИ, рддреЛ FastAPI рддрдм error raise рдХрд░реЗрдЧрд╛ред
рдЗрд╕реЗ APIRouter рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
рдЖрдк frontend files рдХреЛ APIRouter рдореЗрдВ рднреА рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрд╕реЗ prefix рдХреЗ рд╕рд╛рде include рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
{* ../../docs_src/frontend/tutorial004_py310.py hl[6,7] *}
рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, frontend paths /app рдХреЗ рдЕрдВрддрд░реНрдЧрдд serve рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред
App рдореЗрдВ рдХреЛрдИ рднреА рдирд┐рдпрдорд┐рдд path operations рдЕрднреА рднреА precedence рд▓реЗрдВрдЧреЗ, рдЕрдиреНрдп routers рдореЗрдВ рд╢рд╛рдорд┐рд▓ ones рднреАред
Dependencies рдФрд░ Middleware
Frontend responses рд╕рд╛рдорд╛рдиреНрдп FastAPI application рдХреЗ рдЕрдВрджрд░ run рдХрд░рддреА рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП HTTP middleware рдЙрди рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред
App рд╕реЗ, APIRouter рд╕реЗ, рдФрд░ include_router() рд╕реЗ dependencies рднреА frontend responses рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддреА рд╣реИрдВред рдпрд╣ cookie authentication рдпрд╛ рдЗрд╕реА рддрд░рд╣ рд╕реЗ frontend рдХреЛ protect рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
Dependencies response headers рдХреЛ modify рднреА рдХрд░ рд╕рдХрддреА рд╣реИрдВ рдФрд░ background tasks add рдХрд░ рд╕рдХрддреА рд╣реИрдВ, рдЬреИрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп path operations рдХреЗ рд╕рд╛рдеред
рдХреЗрд╡рд▓ Static Build Output
app.frontend() рдЖрдкрдХреЗ frontend build рджреНрд╡рд╛рд░рд╛ рдкрд╣рд▓реЗ рд╕реЗ generate рдХреА рдЧрдИ files serve рдХрд░рддрд╛ рд╣реИред
рдпрд╣ server-side rendering run рдирд╣реАрдВ рдХрд░рддрд╛ред рдпрд╣ рдЙрди frontend frameworks рдХреЗ рд▓рд┐рдП рд╣реИ рдЬреЛ static files generate рдХрд░рддреЗ рд╣реИрдВ, рди рдХрд┐ рдЙрди frameworks рдХреЗ рд▓рд┐рдП рдЬрд┐рдиреНрд╣реЗрдВ рд╣рд░ request рдХреЗ рд▓рд┐рдП server рдкрд░ dynamic rendering рдХреА рдЬрд╝рд░реВрд░рдд рд╣реЛрддреА рд╣реИред