0utputab1e

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

まとめ

他にもいろいろな機能がありますが、触り部分だけ実装してみました。
次回以降、もうちょっと踏み込んで実装してみようと思います。
ではまた!

 

あわせて読みたい記事

>> Homeに戻る