(はじめに)FastAPI Python Webフレームワーク-FlaskやTornadaよりも高性能なAPIフレームワーク

正式には、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/

おすすめ

転載: www.cnblogs.com/dcpeng/p/12716550.html