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>
9.7 KiB
FastAPI CLI
FastAPI CLI рдПрдХ command line рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЖрдк рдЕрдкрдиреЗ FastAPI рдРрдк рдХреЛ serve рдХрд░рдиреЗ, рдЕрдкрдиреЗ FastAPI project рдХреЛ manage рдХрд░рдиреЗ, рдФрд░ рднреА рдмрд╣реБрдд рдХреБрдЫ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЬрдм рдЖрдк рдЕрдкрдиреЗ project рдореЗрдВ FastAPI add рдХрд░рддреЗ рд╣реИрдВ (рдЬреИрд╕реЗ uv add "fastapi[standard]" рдХреЗ рд╕рд╛рде), рддреЛ рдЗрд╕рдХреЗ рд╕рд╛рде рдПрдХ command line рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЖрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк terminal рдореЗрдВ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВред
development рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛ FastAPI рдРрдк рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк fastapi dev command рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
$ <font color="#4E9A06">fastapi</font> dev
<span style="background-color:#009485"><font color="#D3D7CF"> FastAPI </font></span> Starting development server ЁЯЪА
Searching for package file structure from directories with
<font color="#3465A4">__init__.py</font> files
Importing from <font color="#75507B">/home/user/code/</font><font color="#AD7FA8">awesomeapp</font>
<span style="background-color:#007166"><font color="#D3D7CF"> module </font></span> ЁЯРН main.py
<span style="background-color:#007166"><font color="#D3D7CF"> code </font></span> Importing the FastAPI app object from the module with the
following code:
<u style="text-decoration-style:solid">from </u><u style="text-decoration-style:solid"><b>main</b></u><u style="text-decoration-style:solid"> import </u><u style="text-decoration-style:solid"><b>app</b></u>
<span style="background-color:#007166"><font color="#D3D7CF"> app </font></span> Using import string: <font color="#3465A4">main:app</font>
<span style="background-color:#007166"><font color="#D3D7CF"> server </font></span> Server started at <font color="#729FCF"><u style="text-decoration-style:solid">http://127.0.0.1:8000</u></font>
<span style="background-color:#007166"><font color="#D3D7CF"> server </font></span> Documentation at <font color="#729FCF"><u style="text-decoration-style:solid">http://127.0.0.1:8000/docs</u></font>
<span style="background-color:#007166"><font color="#D3D7CF"> tip </font></span> Running in development mode, for production use:
<b>fastapi run</b>
Logs:
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Will watch for changes in these directories:
<b>[</b><font color="#4E9A06">'/home/user/code/awesomeapp'</font><b>]</b>
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Uvicorn running on <font color="#729FCF"><u style="text-decoration-style:solid">http://127.0.0.1:8000</u></font> <b>(</b>Press CTRL+C to
quit<b>)</b>
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Started reloader process <b>[</b><font color="#34E2E2"><b>383138</b></font><b>]</b> using WatchFiles
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Started server process <b>[</b><font color="#34E2E2"><b>383153</b></font><b>]</b>
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Waiting for application startup.
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Application startup complete.
/// tip | рд╕реБрдЭрд╛рд╡
production рдХреЗ рд▓рд┐рдП рдЖрдк fastapi run рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, fastapi dev рдХреА рдЬрдЧрд╣ред ЁЯЪА
///
рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ, FastAPI CLI Uvicorn рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдПрдХ high-performance, production-ready, ASGI server рд╣реИред ЁЯШО
fastapi CLI рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП FastAPI рдРрдк рдХреЛ рдЕрдкрдиреЗ-рдЖрдк detect рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдЧрд╛, рдпрд╣ рдорд╛рдирддреЗ рд╣реБрдП рдХрд┐ рдпрд╣ main.py file рдореЗрдВ app рдирд╛рдо рдХрд╛ object рд╣реИ (рдпрд╛ рдХреБрдЫ рдЕрдиреНрдп variants рдореЗрдВ рд╕реЗ рдХреЛрдИ рдПрдХ)ред
рд▓реЗрдХрд┐рди рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдРрдк рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ configure рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдРрдк entrypoint рдХреЛ pyproject.toml рдореЗрдВ configure рдХрд░реЗрдВ
рдЖрдк pyproject.toml file рдореЗрдВ рдпрд╣ configure рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХрд╛ рдРрдк рдХрд╣рд╛рдБ рд╕реНрдерд┐рдд рд╣реИ, рдЬреИрд╕реЗ:
[tool.fastapi]
entrypoint = "main:app"
рд╡рд╣ entrypoint fastapi command рдХреЛ рдмрддрд╛рдПрдЧрд╛ рдХрд┐ рдЙрд╕реЗ рдРрдк рдХреЛ рдЗрд╕ рддрд░рд╣ import рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:
from main import app
рдЕрдЧрд░ рдЖрдкрдХрд╛ code рдЗрд╕ рддрд░рд╣ structured рдерд╛:
.
тФЬтФАтФА backend
тФВ┬а┬а тФЬтФАтФА main.py
тФВ┬а┬а тФЬтФАтФА __init__.py
рддреЛ рдЖрдк entrypoint рдХреЛ рдЗрд╕ рддрд░рд╣ set рдХрд░реЗрдВрдЧреЗ:
[tool.fastapi]
entrypoint = "backend.main:app"
рдЬреЛ рдЗрд╕рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрдЧрд╛:
from backend.main import app
fastapi dev path рдХреЗ рд╕рд╛рде рдпрд╛ --entrypoint CLI option рдХреЗ рд╕рд╛рде
рдЖрдк fastapi dev command рдХреЛ file path рднреА pass рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ FastAPI app object рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд▓реЗрдЧрд╛:
$ uv run fastapi dev main.py
рдпрд╛, рдЖрдк fastapi dev command рдХреЛ --entrypoint option рднреА pass рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
$ uv run fastapi dev --entrypoint main:app
рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рд╣рд░ рдмрд╛рд░ fastapi command call рдХрд░рддреЗ рд╕рдордп рд╕рд╣реА path\entrypoint pass рдХрд░рдирд╛ рдпрд╛рдж рд░рдЦрдирд╛ рд╣реЛрдЧрд╛ред
рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, рдЕрдиреНрдп tools рдЗрд╕реЗ рдвреВрдБрдврдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП VS Code рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдпрд╛ FastAPI Cloud, рдЗрд╕рд▓рд┐рдП pyproject.toml рдореЗрдВ entrypoint рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреА рдЬрд╛рддреА рд╣реИред
fastapi dev
fastapi dev рдЪрд▓рд╛рдиреЗ рд╕реЗ development mode рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред
Default рд░реВрдк рд╕реЗ, auto-reload enabled рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рдЖрдкрдХреЗ code рдореЗрдВ changes рдХрд░рдиреЗ рдкрд░ server рдХреЛ рдЕрдкрдиреЗ-рдЖрдк reload рдХрд░ рджреЗрддрд╛ рд╣реИред рдпрд╣ resource-intensive рд╣реИ рдФрд░ disabled рд╣реЛрдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрдо stable рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЖрдкрдХреЛ рдЗрд╕реЗ рдХреЗрд╡рд▓ development рдХреЗ рд▓рд┐рдП рд╣реА рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ IP address 127.0.0.1 рдкрд░ рднреА listen рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдЖрдкрдХреА machine рдХрд╛ рдЦреБрдж рд╕реЗ рд╣реА communicate рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ IP рд╣реИ (localhost)ред
рдЖрдкрдХреЗ рдРрдк рдХреЛ import рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, fastapi dev FASTAPI_ENV environment variable рдХреЛ development рдкрд░ set рдХрд░рддрд╛ рд╣реИред рдЕрдЧрд░ FASTAPI_ENV рдкрд╣рд▓реЗ рд╕реЗ set рд╣реИ, рддреЛ рдЗрд╕рдХреА рдореМрдЬреВрджрд╛ value рд╕реБрд░рдХреНрд╖рд┐рдд рд░рдЦреА рдЬрд╛рддреА рд╣реИред рдЗрд╕рд╕реЗ app startup code development-friendly рд╡реНрдпрд╡рд╣рд╛рд░ рдЪреБрди рд╕рдХрддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдЖрдкрдХреЛ staging рдЬреИрд╕рд╛ app-specific environment рджреЗрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓рддреА рд╣реИред
Conventional FASTAPI_ENV values development рдФрд░ production рд╣реИрдВред fastapi run рд╡рд░реНрддрдорд╛рди рдореЗрдВ FASTAPI_ENV рдХреЛ unchanged рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЕрдЧрд░ рдЖрдкрдХреЗ рдРрдк рдХреЛ production mode detect рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ рддреЛ рдЗрд╕реЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ set рдХрд░реЗрдВред
fastapi run
fastapi run execute рдХрд░рдиреЗ рд╕реЗ FastAPI production mode рдореЗрдВ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред
Default рд░реВрдк рд╕реЗ, auto-reload disabled рд╣реЛрддрд╛ рд╣реИред рдпрд╣ IP address 0.0.0.0 рдкрд░ рднреА listen рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдорддрд▓рдм рд╕рднреА available IP addresses рд╣реИ, рдЗрд╕ рддрд░рд╣ рдпрд╣ рдЙрд╕ machine рд╕реЗ communicate рдХрд░ рд╕рдХрдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рднреА рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП publicly accessible рд╣реЛрдЧрд╛ред рдЖрдо рддреМрд░ рдкрд░ рдЖрдк production рдореЗрдВ рдЗрд╕реЗ рдЗрд╕реА рддрд░рд╣ рдЪрд▓рд╛рдПрдБрдЧреЗ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ container рдореЗрдВред
рдЕрдзрд┐рдХрддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЖрдкрдХреЗ рдкрд╛рд╕ рдКрдкрд░ рд╕реЗ HTTPS handle рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ "termination proxy" рд╣реЛрдЧрд╛ (рдФрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП), рдпрд╣ рдЗрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░реЗрдЧрд╛ рдХрд┐ рдЖрдк рдЕрдкрдирд╛ application рдХреИрд╕реЗ deploy рдХрд░рддреЗ рд╣реИрдВ, рдЖрдкрдХрд╛ provider рдЖрдкрдХреЗ рд▓рд┐рдП рдпрд╣ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдпрд╛ рдЖрдкрдХреЛ рдЗрд╕реЗ рдЦреБрдж set up рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реЛ рд╕рдХрддреА рд╣реИред
/// tip | рд╕реБрдЭрд╛рд╡
рдЖрдк рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ deployment documentation рдореЗрдВ рдФрд░ рдЬрд╛рди рд╕рдХрддреЗ рд╣реИрдВред
///