PythonのWebフレームワーク「FastAPI」でアプリケーションを触ってみた
2021-10-25
久しぶりの投稿です!
今回は、Pythonの高速なフレームワーク「FastAPI」でアプリケーションを作っていこうと思います。
FastAPIとは?
FastAPIはPythonのWebフレームワークで、公式によると
- Node.jsやGo言語に匹敵する高パフォーマンス
- 高速に開発できる
- バグを減らせる
- 直感的に実装できる
- 記述量が少なくて済む
- APIドキュメントを自動生成
など、開発者にとってうれしい機能が盛り込まれたフレームワークになっています。
Hello, world!
早速、恒例のハロワしていきましょう。
インストール
$ pip install fastapi uvicorn[standard]
たったこれだけでインストールできる。素晴らしい。
main.py
from fastapi import FastAPI, Request
from fastapi.encoders import jsonable_encoder
from pydantic import BaseModel
from starlette.responses import JSONResponse
from typing import Optional
# サーバ、兼ルーターの作成
app = FastAPI()
# ユーザークラス
class User(BaseModel):
name: str
# ハンドラ作成
@app.get("/")
async def index():
return {"hello": "world"}
たったこれだけです。あとは
$ uvicorn main:app --reload
めっちゃ楽ですね!
アクセスしてみると、
$ curl -XGET "localhost:8000"
{"hello":"world"}
こんな感じで返ってきます。
ハンドラをいじってみる
上記のようにシンプルな実装もできますが、パスパラメータを取ったり、リクエストを扱ったりもできます。
上記のmain.pyに追記してみましょう。
# パスパラメータをとるハンドラ
@app.get("/user/{user_id}")
def get_user(req: Request, user_id: str, page: Optional[str]) -> JSONResponse:
# リクエストヘッダの値を取得できる
_ = request.headers.get("authorization")
print(page)
# 以下のようなレスポンスを作ることもできる
user = User("name": "ichiro")
return JSONResponse(status_code=200, content=jsonable_encoder(user))
リクエストとパスパラメータ、クエリ文字列がハンドラ引数に混在していても、型注釈をつけて判別できます。また、
page: Optional[str]
とすることで、URLのクエリ部分から「page」キーで抽出し、かつ省略可能なクエリ文字列として取得して扱うことができます。
成果物
以下のソースコードを試しに作ってみました。
https://github.com/sukenium/speakable-app-server
まとめ
他にもいろいろな機能がありますが、触り部分だけ実装してみました。
次回以降、もうちょっと踏み込んで実装してみようと思います。
ではまた!