📝

Python FastAPI 最速入門

に公開

Python がある程度できるようになったから、FastAPIを学んでみたい!って人のためのページです。

1. 仮想環境を作る

まずは Python の仮想環境を作りましょう。
venv パッケージを利用して環境を作ります。

# 仮想環境を作成
python -m  venv venv

# 仮想環境を有効化
./venv/Scripts/activate

コンソールの前に (venv) と付いていたら成功です。

2. FastAPIをインストール

仮想環境に、FastAPIUvicorn をインストールします。

python -m pip install fastapi 'uvicorn[standard]'

3. FastAPIを起動する

FastAPIで、サーバーを作成してみます。

ソースコードを配置する src ディレクトリを作成します。
main.py というファイルを作成します。

ファイル階層

project/
  ┣ venv/
  ┗ src/
     ┗ main.py

現在の状態はこの通りです。

main.py

from fastapi import FastAPI
import uvicorn

if __name__ == '__main__':

    # FastAPI を作成
    app = FastAPI()
    
    # localhost:8000 で FastAPI を実行
    uvicorn.run(app, host='localhost', port=8000)

main.py の中に上のコードを書きます。
公式とは違う起動のしかたですが、問題なく起動します。

http://localhost:8000/ にアクセスすることができます。
何の機能もつけていないので {"detail":"Not Found"} というJSONが返ってきます。

4. 静的ルータを作成する

静的ルータを作成してみましょう。
ファイルがあればファイルを返し、無ければ 404 を返すシンプルなサーバーのことです。

まずは、ファイルを公開するディレクトリ public を作成します。
中には、test.txt を作成します。

ファイル階層

project/
  ┣ venv/
  ┣ public/
  ┃  ┗ test.txt
  ┗ src/
     ┗ main.py

main.py

  from fastapi import FastAPI
+ from fastapi.staticfiles import StaticFiles
  import uvicorn

  if __name__ == '__main__':
  
      # FastAPI を作成
      app = FastAPI()
+     app.mount("/main", StaticFiles(directory="public"), name="public")
  
      # localhost:8000 で FastAPI を実行
      uvicorn.run(app, host='localhost', port=8000)

http://localhost:8000/main の後に ファイルパスを書けば、 public 内で同じパスにあるファイルを返そうとします。

http://localhost:8000/main/test.txt にアクセスすると、 public/test.txt が返ってくるはずです。

5. 動的ルータを作成する

動的ルータは、APIサーバーです。
アクセスしてきた人の情報やパラメータによって違う内容を返します。

今回は、 http://localhost:8000/api/routeA を作成してみます。

src ディレクトリの中に、 routers ディレクトリを作成します。
この中に、動的ルータを作成していきます。

routers ディレクトリの中には、route_a.py, __init__.py を作成します。

ファイル階層

project/
  ┣ venv/
  ┣ public/
  ┃  ┗ test.txt
  ┗ src/
     ┣ routers/
     ┃  ┣ __init__.py
     ┃  ┗ route_a.py
     ┗ main.py

route_a.py

from fastapi.routing import APIRouter

router = APIRouter()


@router.get('/api/routeA')
def get():
    '''
    GET /api/routeA
    '''
    
    return 'GET method!'


@router.post('/api/routeA')
def post():
    '''
    POST /api/routeA
    '''
    
    return 'POST method!'

route_a.py はこんな感じです。
http://localhost:8000/api/routeA のにアクセスが来た時の処理の中身を書きます。

router はルータですね。
各関数にデコレータでURLのパスが指定されており、そのパス・メソッドにアクセスが来ると実行されます。

init.py

from .route_a import router as route_a_router

ALL_ROUTERS = [
    route_a_router,
]

ALL_ROUTERS は、ルータをまとめた配列です。
今後ルータが増えたら、この配列に追加していきます。

これらのルータを使用するために、 main.py も改造する必要があります。

main.py

  from fastapi import FastAPI
  from fastapi.staticfiles import StaticFiles
  import uvicorn
+ from routers import ALL_ROUTERS

  if __name__ == '__main__':
  
      # FastAPI を作成
      app = FastAPI()
      app.mount("/main", StaticFiles(directory="public"), name="public")
      
+     # 他のルータを登録
+     for router in ALL_ROUTERS:
+         app.include_router(router)
  
      # localhost:8000 で FastAPI を実行
      uvicorn.run(app, host='localhost', port=8000)

これで、作成したルータが有効になりました。
http://localhost:8000/api/routeA にアクセスしてみましょう。

  • GET メソッドなら、 「GET method!」
  • POST メソッドなら、「POST method!」

と返ってくるはずです。
これでAPIサーバーを自由に作成することができますね。

Discussion