Fast API


Back-End Programming
サーバ形式
  • モノクロアーキテクチャ:1台の大型サーバからなり、1台のサーバですべての機能(サービス、機械など)を処理する
    バージョンを変更するたびに、サーバはブロック全体を構築する必要があるため、導入速度が遅い.
  • マイクロサービスアーキテクチャ:機能サーバを作成し、通信するための複数の独立したサーバからなる構造
  • REST API
    リソースを名前で区切って、リソースを交換する状態を表します.
    1)HTTP URIによりリソースを指定し,2)HTTPメソッドによりそのリソースにCRUD操作を適用する.
    Web上での通信は主に情報インタラクション時に守らなければならない通信プロトコルHTTP(Hyper Text Transfer Protocol)を採用し,基本的に80番ポートを用いてサーバやクライアントと通信する.
    URIとは?
    Uniform Resource Identifierで文字列を構成してインターネット上のリソースを識別
    URIは、インターネット上のリソースの位置を示すURLを含み、URIはより広い範囲である.
    CRUD操作とは?
    CRUDとは、ほとんどのコンピュータソフトウェアが持つ基本的なデータ処理機能です.作成、読み取り、更新、削除です.
    RESTにおけるCRUD操作はHTTPメソッドとして表現され,作成はPOST,読み出しはGET,更新はPUT,PATCH,削除はDELETEとなる.
  • GET vs POST
  • Status Code
    クライアントのリクエストにサーバがどのように応答するかを示すデジタルコード.
    例えば、404ノードFound、502 Bad Gate等のエラー

    Synchronize vs Asynchronize
  • Sync:サーバに要求を送信する場合、クライアント-サーバ通信など、次の操作を実行するためにリアルタイムで応答するTaskが必要です.
    クライアントが情報を要求すると、サーバが応答を返す前に、クライアントは待機状態になります.
  • Async:リクエスト送信時に応答状態にかかわらず次のような操作が可能なTaskは,メールシステムを考えると容易である.
    2人のユーザー間でメールがやり取りされている場合は、他のユーザーの返信を待つことなく、他のタスクを実行できます.
  • Fast API
    Fast APIプロパティ

    FastAPIの利点
  • Flaskよりも簡潔なRouter構文(FastAPIはFlaskから発展した)
  • 非同期サポート
  • Built-in API Documentation(Swagger)
  • PydanticによるシリアルおよびValidation
  • FastAPIの欠点
  • 今まで、Flashのユーザーはもっと多くて、
  • ORMなどのデータベースに関連するライブラリは少ない
    ◇FastAPI公式サイトではデータベース関連の使い方
  • FastAPIプリファレンスパラメータ
    FastAPI構造(インフラストラクチャ)
  • main.py:アプリケーションを実行するEntryPointモジュール
    *最高コード実行の開始点またはプログラム進入点
  • を示す.
  • main.pyまたはapp.py:Flash APIのアプリケーションとルータの設定
  • model.py:MLmodelのクラスと関数定義
  • Pometryを使用した仮想envの管理
    詳細については、PDFを参照してください.
    FastAPIの基礎知識
    Path Parameter vs Query Parameter
    Web上でGetメソッドを用いてデータを転送する方法は2つに分けられる.
    ex)ID 402のユーザ情報を取得したい場合は、
  • Path Parameter:/user/402、変数
  • としてサーバに402という値を渡す
  • Query Parameter:/users?id=402は、入力データがAPIの後にQuery形式で渡される.
    Query StringはKey、Valueペアからなり、「&」を使用して複数ペアのQueryを渡すことができます.
    ex) https://search.naver.com/search.naver?where=nexearch&sm=top_hty&fbm=0&ie=utf8&query=広津区
  • リソースを識別する必要がある場合、Path Parameterがより適切であり、ソートおよびフィルタリングが必要である場合、Query Parameterがより適切である.
  • Path Paramter in FastAPI
    FastAPIは、GetとPostを区別できるレコーダです.
    GETメソッドパラメータである{user id}は関数の値に注入される.
    from fastapi import FastAPI
    import uvicorn
    
    app = FastAPI()
    
    @app.get("users/{user_id}")
    def get_user(user_id):
        return {"user_id": user_id}
    
    if __name__ == '__main__':
        uvicorn.run(app, host='0.0.0.0', port=8000)
    Query Parameter in FastAPI
    Path Parameter方式とは異なり、get URLにParamterを渡す必要はありません.
    でも、URLの後ろに「?「&」でリクエストを接続できます.
    また、データがない場合、自動的にEmpty Listに戻りますので、追加のエラー処理が必要になる場合があります.
    from fastapi import FastAPI
    import uvicorn
    
    app = FastAPI()
    
    fake_db = [{'item_name': 'Foo'}, {'item_name': 'Bar'}, {'item_name': 'Baz'}]
    
    @app.get("/items/")
    def read_item(skip: int=0, limit: int=10):
        return fake_db[skip: skip + limit]
    
    if __name__ == '__main__':
        uvicorn.run(app, host='0.0.0.0', port=8000)
    Optional Parameter
    Optionとして宣言する場合は、TypingモジュールのOptionを使用して特定のパラメータを指定します.
    from typing import Optional
    from fastapi import FastAPI
    import uvicorn
    
    @app.get('/items/{item_id}')
    def read_item(item_id: str, q: Optional[str] = None):
        if q:
            return {'item_id': item_id, 'q': q}
        return {'item_id': item_id}
    
    if __name__ == '__main__':
        uvicorn.run(app, host='0.0.0.0', port=8000)
    Request Body
    クライアントがAPIにデータを送信する場合はRequest Bodyを使用し,この場合はPOSTメソッドを使用する.
    GET方式は要求ヘッダ(URL)にデータを転送し、POST方式は要求Bodyにデータを転送する.
    from typing import Optional
    from fastapi import FastAPI
    import uvicorn
    
    from pydantic import BaseModel
    
    class Item(BaseModel):
        name:str
        description: Optional[str] = None
        price: float
        tax: Optional[float] = None
    
    app = FastAPI()
    
    @app.post("/items/")
    def create_item(item: Item):
        return item
    
    if __name__ == '__main__':
        uvicorn.run(app, host='0.0.0.0', port=8000)
    クラス
  • を作成し、要求Bodyのデータ
  • をシアンで定義する.
  • POSTメソッドとして定義関数のパラメータ宣言タイプHitingの場合、要求BodyデータのタイプがタイプHitingと一致するか否かを検証する
  • .

    Response Body
    POST方式では、response_modelをパラメータとしてデコーダに渡し、クラスごとに自動的に応答を実行する.
    すなわち,APIがクライアントに送信した出力データを宣言されたクラスに変換し,データをValidationしてJson Formatに変換してクライアントに送信する.
    以下のコードを実行すると、要求データはクライアントからAPIにname、description、price、taxの4種類の要求を要求し、APIからクライアントに送信された応答データはname、price、taxから応答として送信される.
    from typing import Optional
    from fastapi import FastAPI
    import uvicorn
    
    from pydamic import BaseModel
    
    class ItemIn(BaseModel):
        name: str
        description: Optional[str] = None
        price: float
        tax: Optional[float] = None
    
    class ItemOut(BaseModel):
        name: str
        price: float
        tax: Optional[float] = None
    
    app = FastAPI()
    
    @app.post('/items/', response_model=ItemOut)
    def create_item(item: ItemIn):
        return item
    
    if __name__ == '__main__':
        uvicorn.run(app, host='0.0.0.0', port=8000)
    Pydantic
    Pydantic Library
    FastAPIでクラスを宣言するライブラリで、要求/応答時にデータ型が正しいかどうかのValidationとSettingsを管理します.
    実行時にタイプロックを強制してデータハンドルを安全に処理
    Python基本タイプ(String、Intなど)とタイプライブラリのList、Dict、TupleのValidationをサポート
  • Pydantic Validation
    下位からPython Classを使用してValidationを行う場合は、initで変数を設定し、If文で例外処理を設定する必要があるため、コードが長くなります.@dataclass Decoratorを使用して設定した場合はinitを使用する必要はありません.文を使用しない場合は、ビルトインメソッドを使用してValidationを実行できますが、Validation用のコードが必要です.
    しかしPydantic ValidationはBaseModelを継承し、データを指定するだけでinitとValidationが自動的に行われます.
  • Pydantic Config