fastapi - FastAPIは、標準のPythonタイプヒントに基づいてPython 3.6以降でAPIを構築するための最新の高速(高性能)Webフレームワークです。

(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

FastAPI

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

テスト カバレッジ パッケージバージョン サポートされているPythonバージョン


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

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


FastAPIは、標準のPythonタイプヒントに基づいてPython 3.6以降でAPIを構築するための最新の高速(高性能)Webフレームワークです。

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

  • 高速NodeJSGoと同等の非常に高いパフォーマンス(StarletteとPydanticのおかげで)。利用可能な最速のPythonフレームワークの1つ

  • コーディングの高速化:機能の開発速度を約200%から300%向上させます。*

  • バグの減少:人間(開発者)が誘発するエラーの約40%を削減します。*

  • 直感的:優れたエディターサポート。どこでも完了。デバッグにかかる​​時間が短縮されます。

  • 簡単:使いやすく、習得しやすいように設計されています。ドキュメントを読む時間が短縮されます。

  • 短い:コードの重複を最小限に抑えます。各パラメーター宣言からの複数の機能。バグが少ない。

  • 堅牢:本番環境に対応したコードを入手します。自動インタラクティブドキュメント付き。

  • 標準ベース:APIのオープン標準に基づいています(以前はSwaggerと呼ばれていました)とJSONスキーマ

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

スポンサー

他のスポンサー

意見

[...]私は最近FastAPIを大量に使用しています。[...]実際にMicrosoftのチームのすべてのMLサービスに使用することを計画しています。それらの一部はコアWindows製品に統合されています。および一部のOffice製品。

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

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

Piero Molino、Yaroslav Dudin、Sai Sumanth Miryala- Uber (ref)

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

Kevin Glisson、Marc Vilanova、Forest Monsen- Netflix (参照)

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

Brian Okken- Python Bytesポッドキャストホスト (参照)

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

Timothy Crosley-ハグクリエーター (参照)

「 RESTAPIを構築するための最新のフレームワークを1つ学びたい場合は、 FastAPIをチェックしてください[...]高速で使いやすく、習得も簡単です[...]

APIをFastAPI切り替えました[...]きっと気に入ると思います[...]

Ines Montani-Matthew Honnibal- Explosion AIの創設者-spaCyクリエーター (参照) - (参照)

Typer、CLIのFastAPI

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

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

要件

Python 3.6+

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

インストール

$ pip install fastapi

---> 100%

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

$ pip install "uvicorn[standard]"

---> 100%

作成する

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

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: Optional[str] = None):
    return {"item_id": item_id, "q": q}
または使用
async def
...

コードで

async
/
await
を使用する場合は、次を使用し
async def
ます。

from typing import Optional

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: Optional[str] = None):
    return {"item_id": item_id, "q": q}

わからない場合は、「お急ぎですか?」をご確認ください。ドキュメントに関するセクション

async
await
ドキュメント内の
セクション。

それを実行します

次のコマンドでサーバーを実行します。

$ 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
    :ファイル
    main.py
    (Pythonの「モジュール」)。
  • 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}
  • どちらのパスも
    GET
    操作を実行します(HTTPメソッドとも呼ばれます)。
  • パス
    /items/{item_id}
    には、である必要があるパスパラメータがあります
    item_id
    int
  • パス
    /items/{item_id}
    にはオプションのクエリ
    str
    パラメータ
    q
    があります。

インタラクティブAPIドキュメント

今すぐに行きますhttp://127.0.0.1:8000/docs

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

Swagger UI

代替APIドキュメント

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

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

ReDoc

アップグレードの例

次に、リクエスト

main.py
から本文を受け取るようにファイルを変更します。
PUT

Pydanticのおかげで、標準のPythonタイプを使用して本体を宣言します。

from typing import Optional

from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()


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


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


@app.get("/items/{item_id}")
def read_item(item_id: int, q: Optional[str] = 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ドキュメントは、新しい本文を含めて自動的に更新されます。

Swagger UI

  • [試してみる]ボタンをクリックすると、パラメータを入力してAPIを直接操作できます。

SwaggerUIインタラクション

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

SwaggerUIインタラクション

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

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

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

ReDoc

要約

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

これは、標準の最新のPythonタイプを使用して行います。

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

標準のPython3.6以降

たとえば、

int
:の場合

item_id: int

または、より複雑な

Item
モデルの場合:

item: Item

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

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

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

  • とリクエスト
    item_id
    のパスにが含まれていることを確認します。
    GET
    PUT
  • がforおよびrequests
    item_id
    のタイプであることを検証します。
    int
    GET
    PUT
    • そうでない場合、クライアントには有用で明確なエラーが表示されます。
  • q
    リクエストに対して(のように
    http://127.0.0.1:8000/items/foo?q=somequery
    )という名前のオプションのクエリパラメータがあるかどうかを確認し
    GET
    ます。
    • q
      パラメータはで宣言されているため
      = None
      、オプションです。
    • それがなければ、
      None
      それは必要になります(の場合の本体のように
      PUT
      )。
  • PUT
    のリクエストについて
    /items/{item_id}
    は、本文をJSONとして読み取ります。
    • である必要がある必須属性があることを確認して
      name
      ください
      str
    • である必要がある必須属性があることを確認して
      price
      ください
      float
    • オプションの属性があることを確認してください。存在する場合
      is_offer
      は、である必要があり
      bool
      ます。
    • これはすべて、深くネストされたJSONオブジェクトでも機能します。
  • JSONとの間で自動的に変換します。
  • OpenAPIを使用してすべてを文書化します。これは、次のユーザーが使用できます。
    • インタラクティブなドキュメンテーションシステム。
    • 多くの言語向けの自動クライアントコード生成システム。
  • 2つのインタラクティブなドキュメントWebインターフェイスを直接提供します。

表面を引っかいただけですが、すべてがどのように機能するかはすでに理解できています。

次のように行を変更してみてください。

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

...から:

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

...に:

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

...そして、エディタがどのように属性をオートコンプリートし、それらのタイプを知っているかを確認してください。

エディターのサポート

より多くの機能を含むより完全な例については、チュートリアル-ユーザーガイドを参照してください。

ネタバレ注意:チュートリアル-ユーザーガイドには以下が含まれます:

  • ヘッダーCookieフォームフィールドファイルなど、他のさまざまな場所からのパラメーターの宣言。
  • 検証制約
    maximum_length
    またはとして設定する方法
    regex
  • 非常に強力で使いやすい依存性注入システム。
  • JWTトークンHTTP基本認証を使用したOAuth2のサポートを含むセキュリティと認証。
  • 深くネストされたJSONモデルを宣言するためのより高度な(しかし同様に簡単な)手法(Pydanticのおかげで)。
  • GraphQLとStrawberryおよびその他のライブラリとの統合。
  • 多くの追加機能(Starletteのおかげで):
    • WebSocket
    • requests
      およびに基づく非常に簡単なテスト
      pytest
    • CORS
    • クッキーセッション
    • ...もっと。

パフォーマンス

独立したTechEmpowerベンチマークは、Uvicornで実行されているFastAPIアプリケーションを、StarletteとUvicorn自体(FastAPIによって内部的に使用されている)の下でのみ利用可能な最速のPythonフレームワークの1つとして示しています。(*)

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

オプションの依存関係

Pydanticが使用:

Starletteが使用:

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

FastAPI / Starletteで使用:

  • uvicorn
    -アプリケーションをロードして提供するサーバー用。
  • orjson
    -を使用する場合は必須です
    ORJSONResponse

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

pip install "fastapi[all]"

ライセンス

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