fastapi - FastAPIフレームワーク、高性能、習得が容易、コーディングが迅速、本番環境に対応

(FastAPI framework, high performance, easy to learn, fast to code, ready for production)

Created at: 2018-12-08 16:21:47
Language: Python
License: MIT

ファストAPI

FastAPIフレームワーク、高性能、習得が容易、コーディングが迅速、本番環境に対応

試験 カバレッジ パッケージバージョン サポートされている Python のバージョン


ドキュメント:https://fastapi.tiangolo.com

ソースコード:https://github.com/tiangolo/fastapi


FastAPI は、標準の Python 型ヒントに基づいて Python 3.7+ で API を構築するための、最新の高速 (高性能) ウェブフレームワークです。

主な機能は次のとおりです。

  • 高速:NodeJSGoと同等の非常に高いパフォーマンス(StarletteとPydanticのおかげで)。利用可能な最速のPythonフレームワークの1つ
  • コーディングの速さ:機能の開発速度を約200%から300%向上させます。*
  • バグの減少: 人的 (開発者) によるエラーを約 40% 削減します。*
  • 直感的:優れたエディターサポート。どこでも完了。デバッグ時間の短縮。
  • 簡単:使いやすく、習得しやすいように設計されています。ドキュメントを読む時間が短縮されます。
  • 短い: コードの重複を最小限に抑えます。各パラメーター宣言からの複数の機能。バグが少ない。
  • 堅牢性: 運用環境に対応したコードを取得します。自動インタラクティブドキュメント付き。
  • 標準ベース: APIのオープンスタンダードに基づいています(そして完全に互換性があります):OpenAPI(以前はSwaggerと呼ばれていました)およびJSONスキーマ

*内部開発チームでのテストに基づく見積もり、本番アプリケーションの構築。

スポンサー

その他のスポンサー

意見

"[...]私は最近FastAPIをたくさん使っています。[...]私は実際に、マイクロソフトのチームのすべてのMLサービスに使用することを計画しています。それらのいくつかは、コアWindows製品といくつかのOffice製品に統合されています。"

カビールカーン-マイクロソフト(参照)

"FastAPIライブラリを採用して、予測を取得するためにクエリできるRESTサーバーを生成しました。[ルートヴィヒの場合]"

ピエロ・モリーノ、ヤロスラフ・ドゥディン、サイ・スマント・ミリヤラ-Uber(参照)

"Netflixは、危機管理オーケストレーションフレームワークのオープンソースリリースを発表できることを嬉しく思います。[FastAPIで構築]"

ケヴィン・グリッソン、マーク・ビラノワ、フォレスト・モンセン - ネットフリックス(参照)

"私はFastAPIに興奮しています。とても楽しいです!"

ブライアン・オッケン-パイソンバイトポッドキャストホスト(参照)

"正直なところ、あなたが構築したものは非常に堅実で洗練されているように見えます。多くの点で、それは私がHugになりたかったものです-誰かがそれを構築するのを見るのは本当に刺激的です。"

ティモシー・クロスリー - ハグクリエーター(参照)

"REST APIを構築するための最新のフレームワークを学びたい場合は、FastAPIをチェックしてください[...]それは速く、使いやすく、学ぶのは簡単です[...]"

"私たちはAPIのためにFastAPIに切り替えました[...]私はあなたがそれを好きになると思います[...]"

イネスモンタニ-マシューホニバル-爆発AIの創設者-spaCyクリエイター(参照)-(参照)

Typer, the FastAPI of CLI

Web API の代わりにターミナルで使用する CLI アプリを構築する場合は、Typer を参照してください。

TyperはFastAPIの小さな兄弟です。そして、それはCLIのFastAPIとなることを意図しています。⌨️🚀

必要条件

パイソン 3.7+

FastAPIは巨人の肩の上に立っています:

取り付け

$ pip install fastapi

---> 100%

また、UvicornHypercornなどの本番環境には、ASGIサーバーも必要になります。

$ pip install "uvicorn[standard]"

---> 100%

作成する

  • 次のファイルを作成します。
    main.py
from typing import Union

from fastapi import FastAPI

app = FastAPI()


@app.get("/")
def read_root():
    return {"Hello": "World"}


@app.get("/items/{item_id}")
def read_item(item_id: int, q: Union[str, None] = None):
    return {"item_id": item_id, "q": q}
または使用...
async def

コードで / を使用する場合は、次を使用します。

async
await
async def

from typing import Union

from fastapi import FastAPI

app = FastAPI()


@app.get("/")
async def read_root():
    return {"Hello": "World"}


@app.get("/items/{item_id}")
async def read_item(item_id: int, q: Union[str, None] = None):
    return {"item_id": item_id, "q": q}

メモ:

わからない場合は、「急いで?」を確認してください。ドキュメントの非同期と待機に関するセクション。

実行する

次のようにサーバーを実行します。

$ uvicorn main:app --reload

INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO:     Started reloader process [28720]
INFO:     Started server process [28722]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
コマンドについて...
uvicorn main:app --reload

コマンドは以下を参照します。

uvicorn main:app

  • main
    : ファイル (Python の "モジュール") です。
    main.py
  • app
    :内部に作成されたオブジェクトライン付き。
    main.py
    app = FastAPI()
  • --reload
    : コードの変更後にサーバーを再起動します。これは開発のためにのみ行ってください。

確認する

http://127.0.0.1:8000/items/5?q=somequeryブラウザを開きます。

JSON 応答は次のように表示されます。

{"item_id": 5, "q": "somequery"}

次のような API が既に作成されています。

  • パスで HTTP 要求を受信します。
    /
    /items/{item_id}
  • どちらのパス操作(HTTPメソッドとも呼ばれます)を取ります。
    GET
  • パスには、次のパス パラメーターが必要です。
    /items/{item_id}
    item_id
    int
  • パスには、オプションのクエリ パラメーターがあります。
    /items/{item_id}
    str
    q

対話型 API ドキュメント

次に、http://127.0.0.1:8000/docs に移動します

自動インタラクティブAPIドキュメント(Swagger UIで提供)が表示されます。

スワガー UI

代替 API ドキュメント

そして今、http://127.0.0.1:8000/redoc に行きます

代替の自動ドキュメント(ReDoc提供)が表示されます。

リドック

アップグレードの例

次に、ファイルを変更しますから本文を受信するリクエスト。

main.py
PUT

Pydanticのおかげで、標準のPython型を使用して本文を宣言します。

from typing import Union

from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()


class Item(BaseModel):
    name: str
    price: float
    is_offer: Union[bool, None] = None


@app.get("/")
def read_root():
    return {"Hello": "World"}


@app.get("/items/{item_id}")
def read_item(item_id: int, q: Union[str, None] = None):
    return {"item_id": item_id, "q": q}


@app.put("/items/{item_id}")
def update_item(item_id: int, item: Item):
    return {"item_name": item.name, "item_id": item_id}

サーバーは自動的にリロードする必要があります(追加したため上記のコマンド)。

--reload
uvicorn

対話型 API ドキュメントのアップグレード

次に、http://127.0.0.1:8000/docs に移動します

  • インタラクティブな API ドキュメントは、新しい本文を含めて自動的に更新されます。

スワガー UI

  • 「試してみる」ボタンをクリックすると、パラメータを入力してAPIと直接対話できます。

スワッガー UI インタラクション

  • 次に、[実行]ボタンをクリックすると、ユーザーインターフェイスがAPIと通信し、パラメーターを送信し、結果を取得して画面に表示します。

スワッガー UI インタラクション

代替 API ドキュメントのアップグレード

そして今、http://127.0.0.1:8000/redoc に行きます

  • 代替ドキュメントには、新しいクエリ パラメーターと本文も反映されます。

リドック

要約

要約すると、パラメータの型、本体などを関数パラメータとして一度宣言します。

これは、標準の最新の Python 型で行います。

新しい構文、特定のライブラリのメソッドやクラスなどを学ぶ必要はありません。

ちょうど標準的なPython 3.7+

たとえば、次の場合です。

int

item_id: int

または、より複雑なモデルの場合:

Item

item: Item

...そして、その単一の宣言であなたは得ます:

  • 以下を含むエディターのサポート:
    • 完了。
    • 型チェック。
  • データの検証:
    • データが無効である場合の自動およびクリアエラー。
    • 深くネストされたJSONオブジェクトに対しても検証できます。
  • 入力データの変換:ネットワークからPythonのデータと型への変換。から読む:
    • JSON.
    • パス パラメーター。
    • クエリ パラメーター。
    • クッキー。
    • ヘッダー。
    • フォーム。
    • ファイル。
  • 出力データの変換:Pythonのデータと型からネットワークデータへの変換(JSONとして):
    • Pythonの型(,,,,,など)を変換します。
      str
      int
      float
      bool
      list
    • datetime
      オブジェクト。
    • UUID
      オブジェクト。
    • データベース モデル。
    • ...などなど。
  • 2つの代替ユーザーインターフェイスを含む自動インタラクティブAPIドキュメント:
    • スワッガーUI。
    • リドク。

前のコード例に戻ると、FastAPIは次のようになります。

  • 要求のパスに andid があることを検証します。
    item_id
    GET
    PUT
  • タイプが要求であることを検証します。
    item_id
    int
    GET
    PUT
    • そうでない場合、クライアントには有用で明確なエラーが表示されます。
  • forrequestsという名前のオプションのクエリパラメータがあるかどうかを確認します。
    q
    http://127.0.0.1:8000/items/foo?q=somequery
    GET
    • パラメータはで宣言されているため、オプションです。
      q
      = None
    • なしでそれは必要とされるでしょう(の場合の体もそうです)。
      None
      PUT
  • 要求のために、本文をJSONとして読み取ります:
    PUT
    /items/{item_id}
    • 必須属性があることを確認してください。
      name
      str
    • 必須属性があることを確認してくださいそれはaでなければなりません。
      price
      float
    • オプションの属性 (存在する場合は a) があることを確認します。
      is_offer
      bool
    • All this would also work for deeply nested JSON objects.
  • Convert from and to JSON automatically.
  • Document everything with OpenAPI, that can be used by:
    • Interactive documentation systems.
    • Automatic client code generation systems, for many languages.
  • Provide 2 interactive documentation web interfaces directly.

We just scratched the surface, but you already get the idea of how it all works.

Try changing the line with:

    return {"item_name": item.name, "item_id": item_id}

...from:

        ... "item_name": item.name ...

...to:

        ... "item_price": item.price ...

...and see how your editor will auto-complete the attributes and know their types:

editor support

For a more complete example including more features, see the Tutorial - User Guide.

Spoiler alert: the tutorial - user guide includes:

  • Declaration of parameters from other different places as: headers, cookies, form fields and files.
  • How to set validation constraints as or .
    maximum_length
    regex
  • A very powerful and easy to use Dependency Injection system.
  • Security and authentication, including support for OAuth2 with JWT tokens and HTTP Basic auth.
  • More advanced (but equally easy) techniques for declaring deeply nested JSON models (thanks to Pydantic).
  • GraphQL integration with Strawberry and other libraries.
  • Many extra features (thanks to Starlette) as:
    • WebSockets
    • extremely easy tests based on and
      requests
      pytest
    • CORS
    • Cookie Sessions
    • ...and more.

Performance

Independent TechEmpower benchmarks show FastAPI applications running under Uvicorn as one of the fastest Python frameworks available, only below Starlette and Uvicorn themselves (used internally by FastAPI). (*)

詳細については、「ベンチマーク」セクションを参照してください。

オプションの依存関係

によって使用されます ピダンティック:

スターレットが使用:

  • 要求 - を使用する場合は必須です。
    TestClient
  • jinja2 - デフォルトのテンプレート構成を使用する場合は必須です。
  • python-マルチパート-フォームの「解析」をサポートする場合に必要です。
    request.form()
  • その危険-サポートに必要です。
    SessionMiddleware
  • pyyaml - Starletteのサポートに必要です(おそらくFastAPIでは必要ありません)。
    SchemaGenerator
  • ujson-使用する場合は必須です。
    UJSONResponse

FastAPI / Starletteによって使用されます:

  • uvicorn-アプリケーションを読み込んで提供するサーバー用。
  • orjson-使用する場合は必須です。
    ORJSONResponse

これらはすべてでインストールできます。

pip install "fastapi[all]"

ライセンス

このプロジェクトは、MITライセンスの条件に基づいてライセンスされています。