🏇

fastAPI入門

2023/02/04に公開

始めに

本記事ではfastAPI本「Building Data Science Applications with FastAPI」を紹介します。この本はオライリーサブスクで読めます。本記事は以前にQiita投稿した記事の再構成です。

原題 Building Data Science Applications with FastAPI
リリース年月 2021/10 (🚨少し昔の本です)
カテゴリ fastAPI入門
お勧め度(5段階) ⭐⭐⭐⭐☆
対象者 fastAPI初心者

fastAPI is 何?

  • Python向けのAPIサーバ構築用ライブラリです。Pythonでバックエンドを組むにはDjangoなどが有名ですが、fastAPIは以下のような特徴があります

この記事 is 何?

  • 下記の書籍の内容(1~4章)をベースにfastAPIの使い方をまとめています(必要に応じて書籍外の情報も入れています)
    【対象本】「Building Data Science Applications with FastAPI」
    • FastAPI本。ベースライブラリPydanticの使い方や一般的なWebサイト構築に必要な要素等を紹介。「OpenCVを使ったリアルタイム😇認識」など実用的なWebアプリケーションが多いのもうれしいところ

https://learning.oreilly.com/library/view/building-data-science/9781801079211/

fastAPI入門

Python環境構築

  • 以下のパッケージを入れればfastAPIを使えるようになる
    • pip install fastapi uvicorn[standard]
  • 動作確認用にHTTPieを使う
    • 他のREST APIツールでもOK
    • テストによる動作確認を行う場合はfastAPIの機能「TestClient」を使うのが便利

FastAPIの基本(RESTfulAPIの開発)

  • サーバー起動方法uvicorn ソースファイル名:サーバー変数名 --host 0.0.0.0
    • host指定しないとリモートからアクセスできない
    • /docs にAPIドキュメントページが自動作成される
  • ルート変数も型ヒントを使ってサクッと指定可能
    image.png
    • 型指定にPythonのEnumクラスを指定すれば値をEnum要素に限定可能
    • fastapi.Path (初期値、条件)をルート変数初期値として入れればルート変数の値を制限可能
      • 引数例
        • lt,gt,le,ge (値域)
        • min_length,max_length (最小/最大値)
        • regex(正規表現)
  • URLパラメータ
    • URL内に該当変数がなければURLパラメータ扱いになる
    • パスではなくQuery()を使用。引数はfastapi.Pathと似た感じ(どちらも内部でpydanticを使っているから)
      image.png
  • req body
    • Body()を使用(引数はPath()等と同じ)
  • Pydantic
    • パス()/Query()/Body()など関数はいずれも内部でPydanticを使っている(型ヒントを拡張したデータチェック)
    • BaseModelによるフィールド定義(下図)
      • TypeScriptの型エイリアス風?
        image.png
  • フォーム
    • Body()ではJsonを受け渡してたが、フォームからのエンコードデータを受け取る場合はForm()
  • ファイルアップロード:File()
  • ファイルアップロード(続き)
    • デフォルトだとアップロードファイルはメモリ内に格納される
      image.png
    • bytesの代わりにUploadFile型ヒントを使うとPython通常のファイルと似た扱いのデータを取得できる(メタデータなどにアクセス可)
      image.png
  • HeaderとCookie
    • Header()とCookie()で指定可能(下図コードではCookieは無指定)
      image.png
  • Requestオブジェクト
    • Header/Cookie/Methodなど、リクエストに関するいろんなデータを取得できる
      image.png

Responseのカスタマイズ

  • これまでは受け取ったオブジェクトをそのまま返していたが、ここからはカスタマイズして返す方法を紹介
  • 状態コードの変更
    • postデコレータに引数status_codeを設定
      image.png
      • レスポンス結果例
        image.png
    • 関数内で変更する場合はResponseオブジェクトのプロパティstatus_codeに設定
  • エラーコードのraise
    • 関数内でエラーと判定した際にHTTPException()によりエラーを発生
  • Responseデータの種別
    • JSONResponse : Responseのサブクラス通常はシリアライズするデータをこれに入れるだけ
    • HTMLResponse : HTMLを返す場合はこちら
    • PlainTextResponse(生文字)
    • RedirectResponse(リダイレクト用)
    • StreamingResponse(ストリームバイトデータ)
    • FileResponse(自動でファイル返信用パスの生成)
  • Responseクラスの使い方
    • メソッドデコレータの引数response_classに上記クラス指定
    • HTMLとPlainTextは文字列を返すだけ
    • RedirectはRedirectResponse(リダイレクト先)を返す
    • FileはFileResponse(返すファイルのローカルパス)を返す
    • それ以外にもカスタマイズしたデータをResponse()で返すことも可能

複数ルータの設定

pydanticデータモデル

概要

  • ここまでFastAPIさまざまなRestAPI要求を処理する例を見てきた

  • 以降、fastAPIの屋台骨でもあるpydanticモデル(BaseModelを継承したクラスによるデータ構造定義)について詳しい使い方を紹介する
    image.png

  • [復習]基本はBaseModelを継承したクラスのメンバーに型ヒントを付けるだけ。型の自由度は高い(プリミティブ型だけでなくEnumやListやdateなども入れられる)

    • 違反したデータを入れるとエラーとともに違反した内容を返してくれる
  • さらには、ほかのpydanicモデルをメンバーとして登録可能
    image.png

  • 必須ではないフィールドにはOptional型を指定

  • デフォルト値を設定することも可能

    • 当然ながらデフォルト値は初期化したタイミングの値を保持し続ける。動的に値を生成する方法は後述
  • Field検証

    • 第3章ではAPI関数の引数の型ヒントで文字列長や値の検証を行ったが、モデルフィールドでField()を使って同様の検証を行うことが可能
      image.png
    • Fieldで使える検証項目はこちらを参照
  • 動的なデフォルト値

    • Field(default_factory=関数)で指定可能
      image.png
  • URLやEmailアドレス型

    • pydanticにはEmail文字列型(EmailStr)、URL文字列型(HttpUrl)があり手動でのsyntaxチェック不要
      image.png
  • 継承

    • 作ったpydanticモデルを継承し拡張可能

カスタムデータ検証

  • フィールド:Field()による簡易検証でなく独自の検証メソッドで検証可能(@ validator())
    image.png
  • オブジェクト:@ root_validatorで受け取った複数の値を使って検証実施可能
    image.png

Pydanticオブジェクト操作

  • インスタンス。dict()で辞書に変換可能
    • .dict(include={含めるフィールド名})や
      .dict(exclude={除外するフィールド名})なども可能
  • 一部のフィールドのみ送信未送信フィールドは更新しない)ことも可能(詳細省略)

まとめ

  • 本記事のもととなった書籍以外の参考書籍としては、Zennの「fastAPI入門」がよい感じにまとまっています
  • この記事で書かれている項目で以外のfastAPIの機能としては「依存性注入(5章)」「テスト機能(TestClient)(9章)」などがあります。

オライリー・ジャパンブスクについて

オライリー・ジャパンサブスクO'Reilly「Learning Platform」では、オライリー・ジャパン書籍を初めに、約6万冊の書籍や動画等が読み放題です。話題になった技術書は半数以上は読める印象です。英書がメインなのがネックですが、ブラウザの翻訳機能を使えば問題なく読めます。個人的にこのサブスクで学習の質が劇的に改善したので、全然関係ない立場ですが勧めて回っています。

概要/使い方/価格などは 以前にまとめたこちらの記事 を参考にしてください

Discussion