FastAPI ๐ ๏ธ, โ ๐ญ, โฉ ๐ก, โฉ ๐, ๐ ๐ญ
---
**๐งพ**: https://fastapi.tiangolo.com
**โน ๐**: https://github.com/tiangolo/fastapi
---
FastAPI ๐, โฉ (โ-๐ญ), ๐ธ ๐ ๏ธ ๐ ๐ ๏ธ โฎ๏ธ ๐ 3๏ธโฃ.8๏ธโฃ โ โ๏ธ ๐ ๐ฉ ๐ ๐ ๐.
๐ โ:
* **โฉ**: ๐ถ โ ๐ญ, ๐ ๐ท๐ช โฎ๏ธ **โณ** & **๐ถ** (๐ ๐ & Pydantic). [1๏ธโฃ โฉ ๐ ๐ ๏ธ ๐ช](#performance).
* **โฉ ๐**: ๐ ๐
๐ ๏ธ โ ๐ 2๏ธโฃ0๏ธโฃ0๏ธโฃ ๐ฏ 3๏ธโฃ0๏ธโฃ0๏ธโฃ ๐ฏ. *
* **๐ฉโโคโ๐จ ๐**: ๐ ๐ 4๏ธโฃ0๏ธโฃ ๐ฏ ๐ฟ (๐ฉโ๐ป) ๐ โ. *
* **๐๏ธ**: ๐ ๐จโ๐จ ๐โ๐ฆบ. ๐ ๏ธ ๐. ๐ ๐ฐ ๐ ๏ธ.
* **โฉ**: ๐ง โฉ โ๏ธ & ๐ก. ๐ ๐ฐ ๐ ๐ฉบ.
* **๐**: ๐ ๐ โ. ๐ โ โช๏ธโก๏ธ ๐ ๐ข ๐. ๐ฉโโคโ๐จ ๐.
* **๐๏ธ**: ๐ค ๐ญ-๐ ๐. โฎ๏ธ ๐ง ๐ ๐งพ.
* **๐ฉ-โ๏ธ**: โ๏ธ ๐ (& ๐ ๐ โฎ๏ธ) ๐ ๐ฉ ๐: ๐ (โช ๐ญ ๐ฆ) & ๐ป ๐.
* โ โ๏ธ ๐ ๐ฏ ๐ ๐ ๐ ๏ธ ๐, ๐ ๐ญ ๐ธ.
## ๐ฐ
{% if sponsors %}
{% for sponsor in sponsors.gold -%}
{% endfor -%}
{%- for sponsor in sponsors.silver -%}
{% endfor %}
{% endif %}
๐ ๐ฐ
## ๐ค
"_[...] ๐ค โ๏ธ **FastAPI** ๐ ๐ซ ๐. [...] ๐ค ๐ค ๐ โ๏ธ โซ๏ธ ๐ ๐ ๐ **โ ๐โ๐ฆบ ๐คธโโ**. ๐ซ ๐โโ ๐ ๏ธ ๐ ๐ **๐ฅ** ๐ฌ & **๐ ** ๐ฌ._"
---
"_๐ฅ ๐ ๏ธ **FastAPI** ๐ ๐ค **๐** ๐ฝ ๐ ๐ช ๐ข ๐ **๐ฎ**. [๐จ๐]_"
๐ฎ๐น ๐ธ๐ป, ๐จ๐ ๐จ๐, & ๐ฑ๐ฐ ๐ ๐ -
๐ (๐ฆ๐ช)
---
"_**๐บ** ๐ ๐ฃ ๐-โน ๐ ๐ **โ ๐งพ** ๐ถ ๐ ๏ธ: **๐จ**โ [๐ โฎ๏ธ **FastAPI**]_"
โก ๐, ๐ ๐ช๐ธ, ๐ฒ ๐ -
๐บ (๐ฆ๐ช)
---
"_๐ค ๐คญ ๐ ๐ ๐ **FastAPI**. โซ๏ธ ๐ โ_"
---
"_๐ค, โซ๏ธโ ๐ โ๏ธ ๐ ๐ ๐ ๐ & ๐ต๐ฑ. ๐ ๐, โซ๏ธ โซ๏ธโ ๐ค ๐ **๐ค** - โซ๏ธ ๐ค ๐ ๐ ๐ฑ ๐ ๐._"
---
"_๐ฅ ๐ ๐ ๐ก 1๏ธโฃ **๐ ๐ ๏ธ** ๐ ๐ ๐, โ
๐
**FastAPI** [...] โซ๏ธ โฉ, โฉ โ๏ธ & โฉ ๐ก [...]_"
"_๐ฅ โ๏ธ ๐ ๐คญ **FastAPI** ๐ **๐** [...] ๐ค ๐ญ ๐ ๐ ๐ โซ๏ธ [...]_"
---
"_๐ฅ ๐ ๐ ๐ ๐ญ ๐ ๐ ๏ธ, ๐ค ๐ ๐ ๐ **FastAPI**. โซ๏ธ **๐ ๐**, **๐
โ๏ธ** & **๐ ๐ ๏ธ**, โซ๏ธ โ๏ธ โถ๏ธ๏ธ **๐ ๐ฆฒ** ๐ ๐ ๏ธ ๐ฅ ๐ ๏ธ ๐ & ๐ ๐ ๐ง & ๐โ๐ฆบ โ
๐ ๐น ๐ซ ๐จโ๐ป._"
---
## **๐**, FastAPI ๐ณ๐จ
๐ฅ ๐ ๐ โณ ๐ฑ โ๏ธ ๐ถ โฉ๏ธ ๐ธ ๐ ๏ธ, โ
๐
**๐**.
**๐** FastAPI ๐ฅ ๐ช. & โซ๏ธ ๐ฏ **FastAPI ๐ณ๐จ**. ๐ถ ๐ถ ๐ถ
## ๐
๐ 3๏ธโฃ.7๏ธโฃ โ
FastAPI ๐ง ๐ โ ๐:
* ๐ ๐ธ ๐.
* Pydantic ๐ ๐.
## ๐ทโโ
```console
$ pip install fastapi
---> 100%
```
๐ ๐ ๐ช ๐ซ ๐ฝ, ๐ญ โ
Uvicorn โ๏ธ Hypercorn.
```console
$ pip install "uvicorn[standard]"
---> 100%
```
## ๐ผ
### โ โซ๏ธ
* โ ๐ `main.py` โฎ๏ธ:
```Python
from typing import Union
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"Hello": "World"}
@app.get("/items/{item_id}")
def read_item(item_id: int, q: Union[str, None] = None):
return {"item_id": item_id, "q": q}
```
โ๏ธ โ๏ธ async def
...
๐ฅ ๐ ๐ โ๏ธ `async` / `await`, โ๏ธ `async def`:
```Python hl_lines="9 14"
from typing import Union
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def read_root():
return {"Hello": "World"}
@app.get("/items/{item_id}")
async def read_item(item_id: int, q: Union[str, None] = None):
return {"item_id": item_id, "q": q}
```
**๐**:
๐ฅ ๐ ๐ซ ๐ญ, โ
_"๐ โ" _ ๐ ๐ `async` & `await` ๐ฉบ.
### ๐ โซ๏ธ
๐ ๐ฝ โฎ๏ธ:
```console
$ uvicorn main:app --reload
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO: Started reloader process [28720]
INFO: Started server process [28722]
INFO: Waiting for application startup.
INFO: Application startup complete.
```
๐ ๐ uvicorn main:app --reload
...
๐ `uvicorn main:app` ๐:
* `main`: ๐ `main.py` (๐ "๐น").
* `app`: ๐ โ ๐ `main.py` โฎ๏ธ โธ `app = FastAPI()`.
* `--reload`: โ ๐ฝ โ โฎ๏ธ ๐ ๐. ๐ด ๐ ๐ ๏ธ.
### โ
โซ๏ธ
๐ ๐ ๐ฅ http://127.0.0.1:8000/items/5?q=somequery.
๐ ๐ ๐ ๐ป ๐จ:
```JSON
{"item_id": 5, "q": "somequery"}
```
๐ โช โ ๐ ๏ธ ๐:
* ๐จ ๐บ๐ธ๐ ๐จ _โก_ `/` & `/items/{item_id}`.
* ๐ฏโโ๏ธ _โก_ โ `GET` ๐ ๏ธ (๐ญ ๐บ๐ธ๐ _๐ฉโ๐ฌ_).
* _โก_ `/items/{item_id}` โ๏ธ _โก ๐ข_ `item_id` ๐ ๐ `int`.
* _โก_ `/items/{item_id}` โ๏ธ ๐ฆ `str` _๐ข = `q`.
### ๐ ๐ ๏ธ ๐ฉบ
๐ ๐ถ http://127.0.0.1:8000/docs.
๐ ๐ ๐ ๐ง ๐ ๐ ๏ธ ๐งพ (๐ ๐ฆ ๐):

### ๐ ๐ ๏ธ ๐ฉบ
& ๐, ๐ถ http://127.0.0.1:8000/redoc.
๐ ๐ ๐ ๐ ๐ง ๐งพ (๐ ๐):

## ๐ผ โป
๐ ๐ ๐ `main.py` ๐จ ๐ช โช๏ธโก๏ธ `PUT` ๐จ.
๐ฃ ๐ช โ๏ธ ๐ฉ ๐ ๐, ๐ Pydantic.
```Python hl_lines="4 9-12 25-27"
from typing import Union
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class Item(BaseModel):
name: str
price: float
is_offer: Union[bool, None] = None
@app.get("/")
def read_root():
return {"Hello": "World"}
@app.get("/items/{item_id}")
def read_item(item_id: int, q: Union[str, None] = None):
return {"item_id": item_id, "q": q}
@app.put("/items/{item_id}")
def update_item(item_id: int, item: Item):
return {"item_name": item.name, "item_id": item_id}
```
๐ฝ ๐ ๐ ๐ (โฉ๏ธ ๐ ๐ฎ `--reload` `uvicorn` ๐ ๐).
### ๐ ๐ ๏ธ ๐ฉบ โป
๐ ๐ถ http://127.0.0.1:8000/docs.
* ๐ ๐ ๏ธ ๐งพ ๐ ๐ โน, ๐ ๐ ๐ช:

* ๐ ๐ ๐ผ "๐ โซ๏ธ ๐
", โซ๏ธ โ ๐ ๐ฅง ๐ข & ๐ ๐ โฎ๏ธ ๐ ๏ธ:

* โคด๏ธ ๐ ๐ "๐ ๏ธ" ๐ผ, ๐ฉโ๐ป ๐ข ๐ ๐ โฎ๏ธ ๐ ๐ ๏ธ, ๐จ ๐ข, ๐ค ๐ & ๐ฆ ๐ซ ๐ ๐ฅ:

### ๐ ๐ ๏ธ ๐ฉบ โป
& ๐, ๐ถ http://127.0.0.1:8000/redoc.
* ๐ ๐งพ ๐ ๐จ ๐ ๐ข ๐ข & ๐ช:

### ๐
๐, ๐ ๐ฃ **๐** ๐ ๐ข, ๐ช, โ๏ธ. ๐ข ๐ข.
๐ ๐ โฎ๏ธ ๐ฉ ๐ ๐ ๐.
๐ ๐ซ โ๏ธ ๐ก ๐ โ, ๐ฉโ๐ฌ โ๏ธ ๐ ๐ฏ ๐, โ๏ธ.
๐ฉ **๐ 3๏ธโฃ.7๏ธโฃ โ**.
๐ผ, `int`:
```Python
item_id: int
```
โ๏ธ ๐ ๐ `Item` ๐ท:
```Python
item: Item
```
...& โฎ๏ธ ๐ ๐ ๐ ๐ ๐ค:
* ๐จโ๐จ ๐โ๐ฆบ, ๐:
* ๐ ๏ธ.
* ๐ โ
.
* ๐ฌ ๐ฝ:
* ๐ง & ๐ โ ๐โ ๐ โ.
* ๐ฌ ๐ ๐ฆ ๐ป ๐.
* ๐ ๏ธ ๐ข ๐ฝ: ๐ โช๏ธโก๏ธ ๐ธ ๐ ๐ฝ & ๐. ๐ โช๏ธโก๏ธ:
* ๐ป.
* โก ๐ข.
* ๐ข ๐ข.
* ๐ช.
* ๐.
* ๐จ.
* ๐.
* ๐ ๏ธ ๐ข ๐: ๐ โช๏ธโก๏ธ ๐ ๐ฝ & ๐ ๐ธ ๐ฝ (๐ป):
* ๐ ๐ ๐ (`str`, `int`, `float`, `bool`, `list`, โ๏ธ).
* `datetime` ๐.
* `UUID` ๐.
* ๐ฝ ๐ท.
* ...& ๐ ๐.
* ๐ง ๐ ๐ ๏ธ ๐งพ, ๐ 2๏ธโฃ ๐ ๐ฉโ๐ป ๐ข:
* ๐ฆ ๐.
* ๐.
---
๐ ๐ โฎ๏ธ ๐ ๐ผ, **FastAPI** ๐:
* โ ๐ ๐ค `item_id` โก `GET` & `PUT` ๐จ.
* โ ๐ `item_id` ๐ `int` `GET` & `PUT` ๐จ.
* ๐ฅ โซ๏ธ ๐ซ, ๐ฉโ๐ป ๐ ๐ โ , ๐ โ.
* โ
๐ฅ ๐ค ๐ฆ ๐ข ๐ข ๐ `q` ( `http://127.0.0.1:8000/items/foo?q=somequery`) `GET` ๐จ.
* `q` ๐ข ๐ฃ โฎ๏ธ `= None`, โซ๏ธ ๐ฆ.
* ๐ต `None` โซ๏ธ ๐ ๐ (๐ช ๐ผ โฎ๏ธ `PUT`).
* `PUT` ๐จ `/items/{item_id}`, โ ๐ช ๐ป:
* โ
๐ โซ๏ธ โ๏ธ โ ๐ข `name` ๐ ๐ `str`.
* โ
๐ โซ๏ธ โ๏ธ โ ๐ข `price` ๐ โ๏ธ `float`.
* โ
๐ โซ๏ธ โ๏ธ ๐ฆ ๐ข `is_offer`, ๐ ๐ `bool`, ๐ฅ ๐.
* ๐ ๐ ๐ ๐ท ๐ ๐ฆ ๐ป ๐.
* ๐ โช๏ธโก๏ธ & ๐ป ๐.
* ๐ ๐ โฎ๏ธ ๐, ๐ ๐ช โ๏ธ:
* ๐ ๐งพ โ๏ธ.
* ๐ง ๐ฉโ๐ป ๐ โก โ๏ธ, ๐ ๐ช๐ธ.
* ๐ 2๏ธโฃ ๐ ๐งพ ๐ธ ๐ข ๐.
---
๐ฅ ๐ ๐งฝ, โ๏ธ ๐ โช ๐ค ๐ญ โ โซ๏ธ ๐ ๐ท.
๐ ๐ โธ โฎ๏ธ:
```Python
return {"item_name": item.name, "item_id": item_id}
```
...โช๏ธโก๏ธ:
```Python
... "item_name": item.name ...
```
...:
```Python
... "item_price": item.price ...
```
...& ๐ โ ๐ ๐จโ๐จ ๐ ๐-๐ ๐ข & ๐ญ ๐ซ ๐:

๐
๐ ๐ผ ๐ ๐
โ, ๐ ๐ฐ - ๐ฉโ๐ป ๐ฆฎ.
**๐ ๐จ**: ๐ฐ - ๐ฉโ๐ป ๐ฆฎ ๐:
* ๐ **๐ข** โช๏ธโก๏ธ ๐ ๐ ๐ฅ: **๐**, **๐ช**, **๐จ ๐** & **๐**.
* โ โ **๐ฌ โ** `maximum_length` โ๏ธ `regex`.
* ๐ถ ๐๏ธ & โฉ โ๏ธ **๐ ๐** โ๏ธ.
* ๐โโ & ๐ค, โ
๐โ๐ฆบ **Oauth2๏ธโฃ** โฎ๏ธ **๐ฅ ๐ค** & **๐บ๐ธ๐ ๐ฐ** ๐.
* ๐
๐ง (โ๏ธ ๐จ โฉ) โ ๐ฃ **๐ ๐ฆ ๐ป ๐ท** (๐ Pydantic).
* **๐น** ๐ ๏ธ โฎ๏ธ ๐ & ๐ ๐.
* ๐ โ โ (๐ ๐):
* ** *๏ธโฃ **
* ๐ถ โฉ ๐ฏ โ๏ธ ๐ ๐ธ๐ฒ & `pytest`
* **โ**
* **๐ช ๐**
* ...& ๐.
## ๐ญ
๐ฌ ๐ธ๐ฒ ๐ ๐ฆ **FastAPI** ๐ธ ๐โโ ๐ฝ Uvicorn 1๏ธโฃ โฉ ๐ ๐ ๏ธ ๐ช, ๐ด ๐ ๐ & Uvicorn ๐ซ (โ๏ธ ๐ FastAPI). (*)
๐ค ๐ ๐ โซ๏ธ, ๐ ๐ ๐.
## ๐ฆ ๐
โ๏ธ Pydantic:
* ujson
- โฉ ๐ป "๐ป".
* email_validator
- ๐ง ๐ฌ.
โ๏ธ ๐:
* httpx
- โ ๐ฅ ๐ ๐ โ๏ธ `TestClient`.
* jinja2
- โ ๐ฅ ๐ ๐ โ๏ธ ๐ข ๐ ๐ณ.
* python-multipart
- โ ๐ฅ ๐ ๐ ๐โ๐ฆบ ๐จ "โ", โฎ๏ธ `request.form()`.
* itsdangerous
- โ `SessionMiddleware` ๐โ๐ฆบ.
* pyyaml
- โ ๐ `SchemaGenerator` ๐โ๐ฆบ (๐ ๐ฒ ๐ซ ๐ช โซ๏ธ โฎ๏ธ FastAPI).
* ujson
- โ ๐ฅ ๐ ๐ โ๏ธ `UJSONResponse`.
โ๏ธ FastAPI / ๐:
* uvicorn
- ๐ฝ ๐ ๐ & ๐ฆ ๐ ๐ธ.
* orjson
- โ ๐ฅ ๐ ๐ โ๏ธ `ORJSONResponse`.
๐ ๐ช โ ๐ ๐ซ โฎ๏ธ `pip install "fastapi[all]"`.
## ๐
๐ ๐ ยฎ ๐ฝ โ ๐ฉ๐ช ๐.