ザクっと立てるFastAPI


環境準備

$ pipenv shell
$ pipenv install fastapi uvicorn

ソースコード

ポイントは、

  • GET
    • パスパラメーター
  • POST
    • ボディの受け取り方
main.py
from fastapi import FastAPI
from pydantic import BaseModel
import dataclasses
import uuid

class UserInput(BaseModel):
    name: str

@dataclasses.dataclass
class User:
    id: str
    name: str

data = dict()

app = FastAPI()

@app.post("/users/")
async def create_user(user_input: UserInput) -> User:
    user_id = str(uuid.uuid4())
    user = User(user_id,user_input.name)
    global data
    data[user_id] = user
    print(user_id)
    return user

@app.get("/users/{user_id}")
async def read_user(user_id: str) -> User:
    return data[user_id]

@app.delete("/users/{user_id}")
async def delete_user(user_id: str) -> None:
    del data[user_id]

起動の仕方

ポイントは

  • ポート番号の指定
  • ホスト名の指定

ホスト名の指定をしないとドメイン指定等、公開するときにハマる。

$ uvicorn main:app --port=8080 --host=0.0.0.0

開発用はreloadをつける。

$ uvicorn main:app --reload --port=8080 --host=0.0.0.0

動作確認

コンテナ化

Dockerfile
FROM python:3.6-slim

COPY Pipfile .
COPY Pipfile.lock .

RUN pip install pipenv --no-cache-dir
RUN pipenv sync --system  

COPY main.py .
CMD pipenv run uvicorn main:app --port=8080 --host=0.0.0.0
$ docker build -t fastapi_test .
$ docker run --rm -p 8080:8080 fastapi_test