- 村上知優
- 約 2,200 文字
- 7,200 View
目次
この記事はPython Advent Calendar 2022 カレンダー2の3日目です。昨日はtttakehさんのじゃんけん画像を分類してみたでした。
はじめに
こんにちは。TIG DXユニットの村上です!
さて、私の所属しているプロジェクトではバックエンドシステムに主にGo言語を用いており、Go言語によるWeb APIを構築しています。
例えばLambdaとGoを使ったサーバーレスWebAPI開発実践入門など、Future Tech Blogには多くのノウハウが投稿されていますので是非ご覧になっていただければと思います。
今回はGo言語ではなくPythonでWeb APIを構築しました。その際にOpenAPI Generatorが便利だったのでご共有します。
OpenAPI Generator
OpenAPI GeneratorはAPIリクエストやレスポンスの内容を定義し、それを元にプログラムを自動生成するツールです。
API定義ファイルの書き方の例と、そこからコードを自動生成する方法をご紹介します。
API定義ファイル
今回のファイル名はopenapi.yamlとします。
以下のようにリクエストパラメータやレスポンスを定義します。
openapi: "3.0.0" |
operationIdで指定した部分が自動生成コードに関数名として反映されます。
コードの自動生成
生成方法はいくつかありますが、今回はdockerを使って自動生成します。
サーバ側、クライアント側どちらを生成するかはgeneratorのコマンドライン引数によって決まります。
例えばサーバ側をPython、クライアント側をGolangで生成する場合、以下のようになります。
サーバ側 |
上記コマンドオプションの-gがgeneratorの指定になります。
generatorに指定できる引数は以下のコマンドで確認できます。
docker run --rm openapitools/openapi-generator-cli list |
また、生成されるパッケージ名はデフォルトでopenapi_serverとなりますが、以下のようにパッケージ名の明示的な指定もできます。
docker run --rm -v ${PWD}:/local openapitools/openapi-generator-cli generate -i /local/openapi.yaml -g python-flask -o /local --package-name test_package |
Pythonのimportパスにも関わってくるため、プロジェクトに沿った名前にすると良いと思います。
自動生成されたファイル
自動生成されたサーバ側のディレクトリ及びその内部のファイルを見ていきたいと思います。
上記のopenapi.yamlからは以下の内容が出力されました。
. |
テスト用のファイルまで自動生成してくれます。
そのままこのディレクトリをプロジェクトディレクトリにできるレベルです。
openapi_server
APIの本体はopenapi_serverになります。この中のcontrollersにAPIの中身を実装していくことになります。
個人的にはcontrollersのファイルにはエラーラッピングやDB接続などの前処理だけを書き、具体的なロジックは別ディレクトリに実装するのが良いと思います。これによってAPIが増えた時にcontrollersの中身が複雑になるのを避けることができます。
例えば以下のようにcoreディレクトリを作成し、さらにその中にAPIエンドポイントごとにディレクトリを用意します。
├── controllers |
handler.pyやmodel.pyに具体的なロジックを実装し、stock_price_controller.pyからそれを参照します。
openapiディレクトリにはopenapi.yamlという生成元ファイルと同じ名前のファイルが生成されています。
中身も一見すると生成元と全く同じように見えますが、よく見るとx-openapi-router-controllerという項目が増えています。
これはAPIへのルーティング設定で、そのAPIがコールされた際にどのファイルが呼び出されるかが定義されています。
paths: |
上記の場合、/v1/sc/{security_cd}/stockPriceがコールされた時、openapi_server/controllers/stock_price_controller.pyのstock_price関数が呼び出されることになります。
.openapi-generator-ignore
このファイルには自動生成時に上書きを禁止するディレクトリやファイルを指定します。
例えばcontrollersやtestのファイルは自動生成するたびに中身が初期化されてしまうため、ここに追記します。
ちなみに手動で新規作成したファイルはそのまま残るため、ここに追加する必要はありません。
openapi_server/controllers/* |
Dockerfile
このDockerfileを使うことで、ローカルに簡単にwebサーバを立てることができます。
docker build -t openapi_server . |
疎通確認をするとAPIのルーティングがしっかりと行われており、返り値が返却されることが分かると思います。
curl http://localhost:8080/v1/sc/4722/stockPrice |
おわりに
Python自体が動的型付け言語なだけあってプログラミング時に型を常に気にする必要があり、結構精神を擦り減らすと思います。
OpenAPI Generatorは型ヒントも付与してくれるため、なるべくコードを自動生成することで型に関する開発コスト削減にもつながると思います。
自動生成コードを使えば結果的にAPIの具体的なロジックだけ実装すれば良いレベルになりますので、採用するメリットは大きいと感じました。
明日は、fujineさんの2022年にお世話になったオライリーのPython書籍5冊です。