Chapter 06

Hello World!

smithonisan
smithonisan
2021.08.23に更新
このチャプターの目次

それでは早速、前章で準備した環境でFastAPIを実行してみましょう。

プロジェクトディレクトリ直下に、 api ディレクトリを作成し、以下の2ファイルを追加します。

api/__init__.py

api/main.py
from fastapi import FastAPI

app = FastAPI()


@app.get("/hello")
async def hello():
    return {"message": "hello world!"}

__init__.py は、この api ディレクトリがpythonモジュールであることを示す 空ファイル です。
main.py にはFastAPIのコードを記述します。

結果として、以下のようなディレクトリ構造になります。

.
├── api
│   ├── __init__.py
│   └── main.py
├── Dockerfile
├── docker-compose.yaml
├── poetry.lock
└── pyproject.toml

詳しいコードの説明は後ほど行いますので、ひとまず Hello World! を実行してみましょう。

APIの立ち上げ

以下のコマンドでAPIを立ち上げます。

shell
$ docker-compose up

すると、以下のようにサーバーが立ち上がり、フォアグラウンドで待ち受けた状態になります。

demo-app_1  | INFO:     Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)
demo-app_1  | INFO:     Started reloader process [1] using watchgod
demo-app_1  | INFO:     Started server process [11]
demo-app_1  | INFO:     Waiting for application startup.
demo-app_1  | INFO:     Application startup complete.

この状態で、ブラウザで以下のURLにアクセスしてみましょう。

http://localhost:8000/docs

するとこのように、 GET /hello というエンドポイントが現れるはずです。これでサーバーが立ち上がりました 🎉

この画面を Swagger UI と呼びます。Swagger UIは、APIの仕様を示すドキュメントです。REST APIを表現する、OpenAPIという形式で定義されます。

"ドキュメント"、と言っても、実はこのUIは単なる静的なドキュメントファイルではなく、実際にAPIの動作を検証することができるスグレモノ(対話的ドキュメント)です。

GUIの /hello が表示されている背景が青色の部分を押してみましょう。

上記のように領域が大きくなります。
次に、右側の 「Try it out」 ボタンを押します。

さらに上記の 「Execute」 が現れますので、こちらを押します。

すると、上記のようにResponsesに実行されたパラメータと、その際のレスポンスが表示されます。

{
  "message": "hello world!"
}

レスポンスを見て頂ければ分かる通り、デフォルトではレスポンスはjsonフォーマットで返却されます。

これは、Request URLに表示されている通り、実際には
http://localhost:8000/hello
のAPIをコールしたときに得られたレスポンスです。

その証拠に、 docker-compose up したウインドウにはこのようにAPIリクエストがログとして表示されているはずです。

demo-app_1  | INFO:     172.19.0.1:64064 - "GET /docs HTTP/1.1" 200 OK
demo-app_1  | INFO:     172.19.0.1:64064 - "GET /openapi.json HTTP/1.1" 200 OK
demo-app_1  | INFO:     172.19.0.1:64068 - "GET /hello HTTP/1.1" 200 OK

何度もExecuteすると、 "GET /hello HTTP/1.1" が複数行表示されるのを確認できます。

コードの意味

それでは、先程のmain.pyの中身を見ていきましょう。

api/main.py
app = FastAPI()

この app は、FastAPIのインスタンスです。 main.pyif __name__ == "__main__": 節を持ちませんが、実際にはuvicornを通してこのファイルの app インスタンスが参照されます。

api/main.py
@app.get("/hello")

@ で始まるこの部分を、Pythonでは デコレータ と呼びます。Javaのアノテーションと似た形式ですが、Pythonのデコレータは、関数を修飾し、関数に新たな機能を追加します。

このFastAPIインスタンスに対するデコレータで修飾された関数を、FastAPIでは パスオペレーション関数 と呼びます。
パスオペレーション関数を構成するデコレータは、以下の2つの部分に分かれます。

  • パス
  • オペレーション

「パス」 は "/hello" の部分を指します。
前述の通り、このAPIは
http://localhost:8000/hello
というエンドポイントを持っています。この /hello のエンドポイントのことを "パス" と呼びます。

「オペレーション」 は "get" の部分を指します。
これはRESTにおけるHTTPメソッド、すなわち GET/POST/PUT/DELETE に代表されるHTTPメソッドを定義します。

def の前に async がついていることにお気づきかもしれません。これは非同期であることを伝える修飾子です。後ほど、高速化について説明する際に 12章 DB操作(CRUDs) で説明をしますので、今はひとまずすべてのパスオペレーション関数の頭に付与しておきましょう。

次章では、このパスオペレーション関数を実際に定義する前に、作成するTODOアプリについて説明をします。