Pythonは、Flask、Django、Falconなどのすばらしいフレームワークのおかげで、軽量のWebアプリケーションの開発で常に人気があります。 Pythonは機械学習言語として主導的な立場にあるため、モデルをパッケージ化してサービスとして提供する場合に特に役立ちます。
何年もの間、Flaskはそのようなタスクの主要なツールでしたが、まだ聞いていない場合は、代わりに新しい候補が登場しました。FastAPIは、その前身に触発された比較的新しいPythonフレームワークです。機能が向上し、多くの欠陥が修正されます。 FastAPIはStarletteの上に構築されており、すばらしい機能がたくさんあります。
最近、彼は非常に人気があり、過去8か月間毎日彼と一緒に仕事をしてきましたが、彼の周りの誇大宣伝はすべて正当化されていると自信を持って言えます。まだ試していない方のために、5つの理由をまとめました。
素敵なシンプルなインターフェース
すべてのフレームワークは、開発者の機能と自由のバランスを取ることを余儀なくされています。Djangoは強力ですが、頑固すぎます。一方、Flaskは、アクションの自由を提供するのに十分な高レベルですが、多くはユーザーに任されています。FastAPIはこの点でFlaskに近いですが、さらに健康的なバランスを実現することができます。
たとえば、FastAPIがエンドポイントを定義する方法を見てみましょう。
from fastapi import FastAPI
from pydantic import BaseModel
class User(BaseModel):
email: str
password: str
app = FastAPI()
@app.post("/login")
def login(user: User):
# ...
# do some magic
# ...
return {"msg": "login successful"}
Pydanticを使用してスキーマを定義します。これは、データ検証用の同様に優れたPythonライブラリです。簡単そうに見えますが、内部では多くのことが行われています。入力データを検証する責任はFastAPIに委任されます。たとえば、電子メールフィールドにタイプの値が含まれているなど、誤った要求が送信された場合
int
、対応するエラーコードが返されますが、アプリケーションはクラッシュせず、内部サーバーエラー(500)がスローされます。そして、それはすべてほとんど無料です。
簡単なサンプルアプリケーション
uvicorn
:
uvicorn main:app
これで、アプリケーションは要求を受け入れることができます。この場合、リクエストは次のようになります。
curl -X POST "http://localhost:8000/login" -H "accept: application/json" -H "Content-Type: application/json" -d "{\"email\":\"string\",\"password\":\"string\"}"
ケーキのアイシングは、Swaggerインタラクティブインターフェイスを使用したOpenAPIに準拠したドキュメントの自動生成です。
FastAPIアプリケーションのSwaggerインターフェイス
非同期
Node.jsまたはGoの対応するものと比較したPythonWSGI Webフレームワークの最大の欠点の1つは、要求を非同期で処理できないことでした。ASGIの導入以来、これはもはや問題ではなく、FastAPIはこの機能を完全に実装しています。次のように、asyncキーワードを使用してエンドポイントを宣言するだけです。
@app.post("/")
async def endpoint():
# ...
# call async functions here with `await`
# ...
return {"msg": "FastAPI is awesome!"}
依存性注入
FastAPIには、依存関係を管理するための非常に優れた方法があります。開発者は、エンドポイントへの依存関係を処理するために埋め込みインジェクションを使用する必要はありませんが、これを強くお勧めします。
たとえば、ユーザーが特定の記事にコメントできるエンドポイントを作成しましょう。
from fastapi import FastAPI, Depends
from pydantic import BaseModel
class Comment(BaseModel):
username: str
content: str
app = FastAPI()
database = {
"articles": {
1: {
"title": "Top 3 Reasons to Start Using FastAPI Now",
"comments": []
}
}
}
def get_database():
return database
@app.post("/articles/{article_id}/comments")
def post_comment(article_id: int, comment: Comment, database = Depends(get_database)):
database["articles"][article_id]["comments"].append(comment)
return {"msg": "comment posted!"}
FastAPI
エンドポイントを呼び出すときに実行時にget_databaseを実行するため、適切と思われる戻り値を使用できます。これには(少なくとも)2つの理由があります。
- ディクショナリを変更することにより、依存関係をグローバルにオーバーライドできます
app.dependency_overrides
。これにより、テストが簡単になり、オブジェクトをモックできます。 - 依存関係(この場合
get_database
)は、より複雑なチェックを実行でき、それらをビジネスロジックから切り離すことができます。問題は大幅に簡素化されます。たとえば、そう簡単にユーザー認証を実装することができます。
データベースとの簡単な統合
SQL、MongoDB、Redis、その他何を選択しても、FastAPIはデータベースを中心にアプリケーションを構築することを強制しません。Djangoを介してMongoDBを使用したことがある場合は、それがどれほど苦痛であるかをご存知でしょう。FastAPIを使用すると、データベースをスタックに追加するのが可能な限り簡単になるため、余分なフックを行う必要はありません。(より正確には、作業量は、特定のフレームワークの使用に伴う複雑さではなく、選択したデータベースによって決定されます。)
真剣に、美しさを見てください。
from fastapi import FastAPI, Depends
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
engine = create_engine("sqlite:///./database.db")
Session = sessionmaker(bind=engine)
def get_db():
return Session()
app = FastAPI()
@app.get("/")
def an_endpoint_using_sql(db = Depends(get_db)):
# ...
# do some SQLAlchemy
# ...
return {"msg": "an exceptionally successful operation!"}
出来上がり!私はあなたがタイプしているのをすでに見ることができます
pip install fastapi
お使いのコンピュータの端末で。
GraphQLのサポート
複雑なデータモデルを使用している場合、RESTは大きなハードルになる可能性があります。前面のわずかな変更でエンドポイントスキーマの更新が必要な場合は、それほどクールではありません。そのような場合、GraphQLはあなたを救います。GraphQLのサポートはPythonWebフレームワークにとって目新しいものではありませんが、GrapheneとFastAPIは連携して機能します。たとえば
graphene_django
Djangoの場合、拡張機能を追加でインストールする必要はありません。すべてが最初から機能します。
+1:優れたドキュメント
もちろん、ドキュメントが不十分なフレームワークは優れたものにはなりません。Django、Flask、その他はこれでうまくやっており、FastAPIはそれらに追いついています。もちろん、彼はずっと若いので、彼についての本はまだ一冊もありませんが、それは時間の問題です。
FastAPIの動作を確認したい場合は、優れたガイドがあります。私が書いた詳細なチュートリアルあなたのドッカー、ドッカー構成するMLモデル、およびGitHubのアクションを展開することができたとします!
要約すると、深層学習モデルを操作するための高速で軽量なフレームワークを探している場合でも、より複雑なものを探している場合でも、FastAPIが選択肢です。私はそれがあなたのために働くとかなり確信しています。