[Python] FastAPI

yeonddoriยท2023๋…„ 3์›” 5์ผ
0

AID_WEB

๋ชฉ๋ก ๋ณด๊ธฐ
2/14

๐Ÿ“ FastAPI

FastAPI๋Š” ํ˜„๋Œ€์ ์ด๊ณ , ๋น ๋ฅด๋ฉฐ(๊ณ ์„ฑ๋Šฅ), ํŒŒ์ด์ฌ ํ‘œ์ค€ ํƒ€์ž… ํžŒํŠธ์— ๊ธฐ์ดˆํ•œ Python3.6+์˜ API๋ฅผ ๋นŒ๋“œํ•˜๊ธฐ ์œ„ํ•œ ์›น ํ”„๋ ˆ์ž„์›Œํฌ์ด๋‹ค.

์ฃผ์š” ํŠน์ง•

  • NodeJS ๋ฐ Go์™€ ๋Œ€๋“ฑํ•  ์ •๋„๋กœ ๋งค์šฐ ๋†’์€ ์„ฑ๋Šฅ์„ ๊ฐ€์ง.
  • ์•ฝ 200%์—์„œ 300%๊นŒ์ง€ ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ ์†๋„ ์ฆ๊ฐ€ํ•จ.
  • ๊ฐœ๋ฐœ์ž์— ์˜ํ•œ ์—๋Ÿฌ๊ฐ€ ์•ฝ 40% ๊ฐ์†Œํ•จ.
  • ์ž๋™ ์™„์„ฑ์ด ๋˜๋ฉฐ ๋””๋ฒ„๊น… ์‹œ๊ฐ„์ด ์ ์Œ.
  • ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•˜๊ณ  ๋ฐฐ์šฐ๋„๋ก ์„ค๊ณ„๋จ.
  • ์ฝ”๋“œ ์ค‘๋ณต์„ ์ตœ์†Œํ™”ํ•˜๊ณ  ๊ฐ ๋งค๊ฐœ๋ณ€์ˆ˜ ์„ ์–ธ์˜ ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ์ด ์กด์žฌํ•จ.
  • API์— ๋Œ€ํ•œ (์™„์ „ํžˆ ํ˜ธํ™˜๋˜๋Š”) ๊ฐœ๋ฐฉํ˜• ํ‘œ์ค€ ๊ธฐ๋ฐ˜์ž„.

์„ค์น˜ ๋ฐฉ๋ฒ•

1. ๋ช…๋ น ํ”„๋กฌํ”„ํŠธ(cmd)์—์„œ fastapi ์„ค์น˜
pip install fastapi

2. ๋ช…๋ น ํ”„๋กฌํ”„ํŠธ(cmd)์—์„œ uvicorn ์„ค์น˜
pip install uvicorn[standard]

  • Uvicorn
    Uvicorn์€ uvloop ๋ฐ httptools๋ฅผ ์‚ฌ์šฉํ•˜๋Š” Python์šฉ ASGI ์›น ์„œ๋ฒ„์ด๋‹ค.

    • Uvloop
      libuv๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ Cython์œผ๋กœ ์ž‘์„ฑ๋˜์—ˆ์œผ๋ฉฐ ์‹ค์ œ ์„ฑ๋Šฅ์ƒ์—์„œ Nodejs, Gevent ๋ฐ ๊ธฐํƒ€ Python ๋น„๋™๊ธฐ ํ”„๋ ˆ์ž„ ์›Œํฌ๋ณด๋‹ค 2๋ฐฐ ์ด์ƒ ๋น ๋ฅด๋‹ค.

    • ASGI
      ASGI๋Š” ๋น„๋™๊ธฐ ๊ฐ€๋Šฅ Python ์›น ์„œ๋ฒ„, ํ”„๋ ˆ์ž„์›Œํฌ ๋ฐ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ๊ฐ„์˜ ํ‘œ์ค€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•œ WSGI์˜ ์˜์  ํ›„์† ์ œํ’ˆ์ด๋‹ค.

์ฝ”๋“œ ์ž‘์„ฑ

๋‹ค์Œ์€ FastAPI์˜ ์ฝ”๋“œ ๊ธฐ๋ณธ ์–‘์‹์ด๋‹ค.

from fastapi import FastAPI
app = FastAPI()

@app.get("/")
def ํ•จ์ˆ˜์ด๋ฆ„():
  return '๋ณด๋‚ผ ๊ฐ’'

๋จผ์ € FastAPI๋ฅผ importํ•œ ๋‹ค์Œ, @app.get("/")์œผ๋กœ ํ•ด๋‹น "/" ํŽ˜์ด์ง€์— ์‚ฌ์šฉ์ž๊ฐ€ ์ ‘์†ํ–ˆ์„ ๋•Œ์˜ ๊ธฐ๋Šฅ์„ ์ž‘์„ฑํ•œ๋‹ค.

์‹คํ–‰ํ•˜๊ธฐ

uvicorn main:app --reload

๋‹ค์Œ์€ ์„œ๋ฒ„๋ฅผ ์‹คํ–‰์‹œํ‚ค๋Š” ๋ช…๋ น์–ด๋กœ, ๋ช…๋ น ํ”„๋กฌํ”„ํŠธ(cmd)์—์„œ ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์น˜๋ฉด ํ™”๋ฉด๊ณผ ๊ฐ™์ด ์„œ๋ฒ„๊ฐ€ ๊ตฌ๋™๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

์˜ˆ์‹œ

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}

๊ณต์‹ ์‚ฌ์ดํŠธ์˜ ์˜ˆ์‹œ์ธ ์ด ์ฝ”๋“œ๋ฅผ ๋Œ๋ฆฌ๊ฒŒ ๋˜๋ฉด,
http://127.0.0.1:8000/
๊ฒฝ๋กœ๊ฐ€ "/"๋กœ ๋งž์ถฐ์ง„ ์ด ๋งํฌ์—์„œ๋Š” {"Hello":"World"} ์‘๋‹ต์„,

http://127.0.0.1:8000/items/5?q=somequery
๊ฒฝ๋กœ๊ฐ€ "/items/{item_id}"๋กœ ๋งž์ถฐ์ง„ ์ด ๋งํฌ์—์„œ๋Š” {"item_id": 5, "q": "somequery"} ์‘๋‹ต์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿช„ ๋งˆ์น˜๋ฉด์„œ

FastAPI๋Š” ์„œ๋ฒ„ ์›น ํ”„๋ ˆ์ž„์›Œํฌ ์ค‘ ๊ฐ€์žฅ ์‰ฝ๊ณ  ๋น ๋ฅด๊ฒŒ ๋ฐฐ์šธ ์ˆ˜ ์žˆ๋Š” ๊ฒŒ ์•„๋‹๊นŒ ์‹ถ๋‹ค. HTML ํŒŒ์ผ์„ ์ „์†กํ•˜๊ฑฐ๋‚˜, ์œ ์ €์—๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›๋Š” ๋“ฑ ์‹ฌํ™”์ ์œผ๋กœ ๊ณต๋ถ€๋งŒ ํ•œ๋‹ค๋ฉด ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ์ˆ˜์›”ํ•˜๊ฒŒ ์“ธ ์ˆ˜ ์žˆ์„ ๊ฒƒ์œผ๋กœ ๋ณด์ธ๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€

๊ด€๋ จ ์ฑ„์šฉ ์ •๋ณด