FastAPIフレームワーク、高性能、習得が容易、コーディングが高速、本番環境に対応
ドキュメント:https://fastapi.tiangolo.com
ソースコード:https://github.com/tiangolo/fastapi
FastAPIは、標準のPythonタイプヒントに基づいてPython 3.6以降でAPIを構築するための最新の高速(高性能)Webフレームワークです。
主な機能は次のとおりです。
高速:NodeJSやGoと同等の非常に高いパフォーマンス(StarletteとPydanticのおかげで)。利用可能な最速のPythonフレームワークの1つ。
コーディングの高速化:機能の開発速度を約200%から300%向上させます。*
バグの減少:人間(開発者)が誘発するエラーの約40%を削減します。*
直感的:優れたエディターサポート。どこでも完了。デバッグにかかる時間が短縮されます。
簡単:使いやすく、習得しやすいように設計されています。ドキュメントを読む時間が短縮されます。
短い:コードの重複を最小限に抑えます。各パラメーター宣言からの複数の機能。バグが少ない。
堅牢:本番環境に対応したコードを入手します。自動インタラクティブドキュメント付き。
*社内開発チームでのテストに基づく見積もり、実稼働アプリケーションの構築。
「[...]私は最近FastAPIを大量に使用しています。[...]実際にMicrosoftのチームのすべてのMLサービスに使用することを計画しています。それらの一部はコアWindows製品に統合されています。および一部のOffice製品。」
「FastAPIライブラリを採用して、予測を取得するためにクエリできるRESTサーバーを生成しました。[Ludwigの場合]」
「Netflixは、危機管理オーケストレーションフレームワークのオープンソースリリースを発表できることを嬉しく思います:ディスパッチ![ FastAPIで構築]」
「私はFastAPIに興奮しています。とても楽しいです!」
「正直なところ、あなたが構築したものは非常に堅実で洗練されているように見えます。多くの点で、それは私がハグになりたかったものです-誰かがそれを構築するのを見るのは本当に刺激的です。」
「 RESTAPIを構築するための最新のフレームワークを1つ学びたい場合は、 FastAPIをチェックしてください[...]高速で使いやすく、習得も簡単です[...]」
「APIをFastAPIに切り替えました[...]きっと気に入ると思います[...]」
Web APIの代わりにターミナルで使用するCLIアプリを構築している場合は、Typerを確認してください。
TyperはFastAPIの小さな兄弟です。そして、それはCLIのFastAPIであることが意図されています。
Python 3.6+
FastAPIは巨人の肩の上に立っています:
$ pip install fastapi
---> 100%
UvicornやHypercornなどの本番環境用の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があります。
今すぐに行きますhttp://127.0.0.1:8000/docs。
自動インタラクティブAPIドキュメント(Swagger UIによって提供)が表示されます。
そして今、に行きますhttp://127.0.0.1:8000/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
今すぐに行きますhttp://127.0.0.1:8000/docs。
そして今、に行きますhttp://127.0.0.1:8000/redoc。
要約すると、パラメータのタイプ、本体などを関数パラメータとして宣言します。
これは、標準の最新のPythonタイプを使用して行います。
新しい構文、特定のライブラリのメソッドやクラスなどを学ぶ必要はありません。
標準のPython3.6以降。
たとえば、
int:の場合
item_id: int
または、より複雑な
Itemモデルの場合:
item: Item
...そしてその単一の宣言であなたは得る:
strを変換します。
int
float
bool
list
datetimeオブジェクト。
UUIDオブジェクト。
前のコード例に戻ると、FastAPIは次のようになります。
item_idのパスにが含まれていることを確認します。
GET
PUT
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ます。
表面を引っかいただけですが、すべてがどのように機能するかはすでに理解できています。
次のように行を変更してみてください。
return {"item_name": item.name, "item_id": item_id}
...から:
... "item_name": item.name ...
...に:
... "item_price": item.price ...
...そして、エディタがどのように属性をオートコンプリートし、それらのタイプを知っているかを確認してください。
より多くの機能を含むより完全な例については、チュートリアル-ユーザーガイドを参照してください。
ネタバレ注意:チュートリアル-ユーザーガイドには以下が含まれます:
maximum_lengthまたはとして設定する方法
regex。
requestsおよびに基づく非常に簡単なテスト
pytest
独立したTechEmpowerベンチマークは、Uvicornで実行されているFastAPIアプリケーションを、StarletteとUvicorn自体(FastAPIによって内部的に使用されている)の下でのみ利用可能な最速のPythonフレームワークの1つとして示しています。(*)
詳細については、ベンチマークのセクションを参照してください。
Pydanticが使用:
ujson--JSONの「解析」を高速化します。
email_validator-電子メールの検証用。
Starletteが使用:
requests-を使用する場合は必須です
TestClient。
jinja2-デフォルトのテンプレート構成を使用する場合に必要です。
python-multipart-フォームの「解析」をサポートする場合は、。を使用して必須です
request.form()。
itsdangerous-
SessionMiddlewareサポートに必要です。
pyyaml-Starletteの
SchemaGeneratorサポートに必要です(FastAPIではおそらく必要ありません)。
ujson-を使用する場合は必須です
UJSONResponse。
FastAPI / Starletteで使用:
これらすべてをでインストールできます
pip install "fastapi[all]"。
このプロジェクトはMITライセンスの条件の下でライセンスされています。