python
以前にPythonでWebサーバを構築したくなり、Flaskでサーバを立てた。 個人的にはFlaskの使い勝手に満足していたが、その後プロジェクトに参加したときに 他のメンバーの希望でFastAPIを採用することになり使い始めた。せっかくなのでこちらの使い方もまとめておこうと思う。
FastAPIとFlaskの比較
比較と銘打っておいたが、実のところFastAPIを触った第一感としては「Flaskとかなり似ているな」ということろだった。正直のところ、PythonでWebをやるのに最初に手を付けるのならどちらでもよい。
逆にいえば大して変わらない上にAPI構築に特化した機能が増えているので、そちらの機能が欲しければFlaskからの乗り換えは検討してもよいだろう。
比較のポイントをまとめると
- FlaskとFast APIの書き方はかなり似ている
- FlaskでもREST APIを立てられる:単にjsonを返せばよい
- Fast APIでもAPI以外の人間向けWebサーバを立てられる:htmlのレンダリングや性的ファイルの配信も可能
- Fast APIの強み:pydanticと連携して型検査やバリデーションの機能が充実している
- Flaskの強み:(今のところ)より大きいユーザコミュニティからくるプラグインやドキュメントの充実度
サーバを立てるまで
まずまだインストールしていなかったらpipでFast APIを手持ちのPython環境に入れる。$ pip install fastapi[standard]なおfastapiにはいくつかのインストールおオプションがあるが、今回はデプロイツールなども入っていて お手軽なstandardで入れる。
次にシンプルなサーバを単独pyファイルで完結する形で書いてみる。 サンプルコードは以下
from fastapi import FastAPI app = FastAPI() @app.post("/test") def test_post(data: str): print("post:", data) return {"data-post": data} @app.get("/test") def test_get(data: str): print("post:", data) return {"data-get": data}Fast APIではFlaskと異なり自前のmain関数の中でサーバを立てるというようなことはできず、 外部のwebサービング用モジュール(WSGIなど) よってmainは実装せず、appにアクセスポイントを追加する処理のみを書く。
またreturnする値はdict型そのままでよく、FastAPI内部で自動でjsonに直してレスポンスを組み立ててくれる。
これが書けたらコマンドラインに戻り
$ fastapi dev fastapi_sample.pyとして開発モードでサーバを起動する。
次に立てたサーバにアクセスしてみる。まずはブラウザで/testに手っ取り早くアクセスしてみる。
http://127.0.0.1:8000/test?data=hoge
にアクセスして{"data-get":"hoge"}が表示されればokである。
なおこのdataの様に特に指定せずに関数の引数として指定したパラメータは、
アドレス末尾に?に続いて付加するクエリパラメータになる点に注意する。
POSTはブラウザから投げにくいのでコマンドライン上でwebリクエストを組み立てられるcurlコマンドを使ってアクセスしてみよう。
$ curl -X POST "http://127.0.0.1:8000/test?data=hoge" {"data-post":"hoge"}のようにgetと同じようなレスポンスが返ってくれば成功である。
おすすめ記事
FlaskでWebサーバを立てるサンプル~最小限のコードでFlaskサーバを外部公開~外から接続できないときのチェックポイント
PythonからGemini APIを叩く:requestsを使うのが簡単