正式には、FastAPIは、Python 3.6以降を使用して標準のPythonタイプヒントに基づいてAPIを構築する、モダンで高速な(高性能)Webフレームワークです。
FastAPIは巨人の肩の上に立っていますか?
この巨人は、大部分がFlaskフレームワークを指します。
FastAPIは、文法的にはFlaskに非常に似ており、類似点と相違点があります。
技術的背景:Py3.6 +、Starlette、Pydantic
実際、FastAPIだけでなく、SanicもFlaskの迅速な開発に基づくWeb APIフレームワークです。
さらに面倒なことなく、コードはいつでも(頭を抱えている)快感を直接開きます。
インストールする
pip install fastapi
pip install uvicorn
main.pyファイルを作成する
from fastapi import FastAPI
app = FastAPI() # 创建 api 对象
@app.get("/") # 根路由
def root():
return {"武汉": "加油!!!"}
@app.get("/say/{data}")
def say(data: str,q: int):
return {"data": data, "item": q}
上記で構築された最も単純なFastAPIアプリケーションはFlaskとまったく同じに見えますが、説明のつかない喜びがあります。
次のコマンドを使用してサーバーを起動します。
uvicorn main:app --reload
FastAPIは、uvicornを使用してサービスを実行することをお勧めしますUvicornは、uvloopとhttptools上に構築された超高速ASGIサーバーです。
uvicorn main:アプリは以下を参照します:
main:ファイルmain.py
app:作成された有効なオブジェクト
--reload:コード開発を容易にするホットスタート
起動インターフェースは次のとおりです。
INFO情報により、ローカルポート8000を監視したことがわかります。結果を取得するには、http://127.0.0.1:8000にアクセスしてください
着信パラメーター
FastAPIの非同期コードを見てみましょう
from fastapi import FastAPI
app = FastAPI() # 创建 api 对象
@app.get("/") # 根路由
async def root():
return {"武汉": "加油!!!"}
@app.get("/say/{data}")
async def say(data: str,q: int = None):
return {"data": data, "q": q}
サービス開始後のアクセス結果は同じです。
上記のルーティング方法では、qパラメータを渡し、初期値はNoneです。デフォルト値が指定されておらず、パラメータが渡されない場合、コードは直接エラーを報告します。
FastAPIがエラーを処理する方法を見てみましょう。
エラーが報告された場合でも、非常にわかりやすいエラーフィールドを含むJSONを入力するのはすばらしいことです。これは、FastAPIの人的エラーを減らす機能も反映しており、戻り値はより簡潔で直感的です。
コマンドラインでの出力:
FastAPIのインタラクティブなドキュメントを見てみましょう
公式ドキュメントによると、http://127.0.0.1:8000 / docsを開きます
参照してください:
動的着信データをサポート:
結果:
インタラクティブなエクスペリエンスも非常に友好的であり、コードを本番環境でより堅牢にします。
FastAPI操作の波をすばやく体験できるようになりました。これはFlaskに似ており、コードも類似しており、操作性が向上しています。
次に、Python Webフレームワークの最新のパフォーマンス応答バージョンを確認します。
同時実行性の観点から、Flaskは完全に押しつぶされ(実際には、非同期フレームワークでもある竜巻よりもはるかに進んでいます)、FastAPIは実際にはカバーされていないようです。
クエリパラメータ
最初に公式の小さなデモを見てください
from fastapi import FastAPI
app = FastAPI()
fake_items_db = [{"item_name": "Foo"}, {"item_name": "Bar"}, {"item_name": "Baz"}]
@app.get("/items/")
async def read_item(skip: int = 0, limit: int = 10):
return fake_items_db[skip : skip + limit]
クエリは?&文字で区切られた、URL内のキーワードの後のキーと値のペアのセットです。
URLでのクエリ
http://127.0.0.1:8000/items/?skip=0&limit=10
skip:クエリの開始パラメーター
limit:クエリの終了パラメーター
クエリリストに正常に戻りました。
クエリパラメータの型変換
FastAPIは、パスパラメータとクエリパラメータを区別するのに十分スマートです。
特定の例を見てみましょう:
from fastapi import FastAPI
app = FastAPI()
@app.get("/items/{item_id}")
async def read_item(item_id: str, q: str = None, short: bool = False):
item = {"item_id": item_id}
if q:
item.update({"q": q})
if not short:
item.update(
{"description": "This is an amazing item that has a long description"}
)
return item
アクセスパスを確認し、次のURLアクセス方法のいずれかを実行します
http://127.0.0.1:8000/items/武漢来る?短い= 1
http://127.0.0.1:8000/items/武漢が来る?short = True
http://127.0.0.1:8000/items/武漢は来る?短い= true
http://127.0.0.1:8000/items/武漢は来る?短い=オン
http://127.0.0.1:8000/items/武漢は来る?短い=はい
大文字や小文字などがブール値パラメーターTrueに変換されることがわかります。これはファジー検証パラメーターと呼ばれ、開発者にとって朗報です。
shortパラメータにデフォルト値がない場合、パラメータを渡す必要があることを知っておくことが重要です。そうでない場合、FastAPIは次のようなエラーメッセージを返します。
{
"detail": [
{
"loc": [
"query",
"needy"
],
"msg": "field required",
"type": "value_error.missing"
}
]
}
データモデルを作成する
前述のように、FastAPIはPydanticモジュールに依存しているため、最初にPydanticのBaseModelクラスをインポートする必要があります。
from fastapi import FastAPI
from pydantic import BaseModel
# 请求主体类
class Item(BaseModel):
name: str = "武汉加油 !!"
description: str = None
price: float = 233
tax: float = None
app = FastAPI()
@app.post("/items/")
async def create_item(item: Item):
return item
投稿リクエストを送信してアイテム(リクエスト本文)を送信し、戻って送信プロセスを確認します。
正常に送信し、200ステータスコードを返しました
リクエストボディ+パス+クエリパラメータ、リクエストボディに基づいてURL動的パスパラメータとクエリパラメータを追加
from fastapi import FastAPI
from pydantic import BaseModel
class Item(BaseModel):
name: str
description: str = None
price: float
tax: float = None
app = FastAPI()
@app.put("/items/{item_id}")
async def create_item(item_id: int, item: Item, q: str = None):
result = {"item_id": item_id, **item.dict()}
if q:
result.update({"q": q})
return result
putメソッドは更新に使用され、パラメータを渡した後に辞書を返します。
テンプレートエンジンについて
FastAPIには、Flaskのような独自のテンプレートエンジン(Jinja2)がないため、デフォルトのテンプレートエンジンはありません。別の見方をすると、FastAPIはテンプレートエンジンの選択においてより柔軟で非常に快適になりました。
Jinja2テンプレートを例に取る
依存関係をインストールする
pip install jinja2
pip install aiofiles # 用于 fastapi 的异步静态文件
特定の使用法
# -*- coding:utf-8 -*-
from fastapi import FastAPI, Request
from fastapi.staticfiles import StaticFiles
from fastapi.templating import Jinja2Templates
import uvicorn
app = FastAPI()
app.mount("/static", StaticFiles(directory="static"), name="static") # 挂载静态文件,指定目录
templates = Jinja2Templates(directory="templates") # 模板目录
@app.get("/data/{data}")
async def read_data(request: Request, data: str):
return templates.TemplateResponse("index.html", {"request": request, "data": data})
if __name__ == '__main__':
uvicorn.run(app, host="127.0.0.1", port=8000)
HTMLファイルのレンダリング
<html>
<head>
<title>武汉加油</title>
</head>
<body>
<h1>高呼: {{ data }}</h1>
</body>
</html>
ブラウザでhttp://127.0.0.1:8000/data/Wuhanと入力します
返されるTemplateResponeレスポンスでは、リクエストコンテキストオブジェクトを取得する必要があり、受信パラメータは同じディクショナリに配置されることに注意してください。
このようにして、FlaskのようなおなじみのJinja2を使用できます。
要約すると、FastAPIは使用方法も非常にシンプルで、高速で、パフォーマンスが高く、フォールトトレランスが高く、全体的に強力です。しかし、私はこのような高速なフレームワークについて考えています。結局のところ、それは長い間リリースされておらず、Flaskフレームワークやさまざまなプラグインなどのサードパーティライブラリが不足しています。
これまでのところ、FastAPIのいくつかの基本的な使用法はほぼ終わりましたが、FastAPIの公式ドキュメントには詳細な導入と例があります。
公式ドキュメント:https://fastapi.tiangolo.com/