Python

FastAPI

FastAPIクエリパラメータと文字列検証の詳細解説

FastAPIクエリパラメータと文字列検証の詳細解説

FastAPIのクエリ検証基礎

クエリパラメータとは

FastAPIでは、クエリパラメータを使用してURLに追加情報を渡すことが可能です。例えば、?q=検索語 のように利用されます。これにより、クライアントはリクエストの詳細を指定することができます。

クエリパラメータの定義方法

FastAPIでは関数の引数としてクエリパラメータを定義します。デフォルト値を設定することで、そのパラメータがオプションであることを示すことができます。

from fastapi import FastAPI

app = FastAPI()

@app.get("/items/")
def read_items(q: str = None):
    if q:
        return {"items": [f"Item matching {q}"]}
    return {"items": ["Item1", "Item2"]}

上記の例では、q がクエリパラメータとして定義されており、クエリが提供された場合と提供されない場合で異なるレスポンスを返します。

クエリパラメータのバリデーション

FastAPIはPydanticを使用してクエリパラメータのバリデーションを行います。これにより、入力データの型や値を簡単に検証することができます。

from fastapi import FastAPI, Query

app = FastAPI()

@app.get("/users/")
def get_users(age: int = Query(..., ge=18, le=100)):
    return {"age": age}

この例では、age パラメータが18以上100以下であることをバリデートしています。Query(...)... はこのパラメータが必須であることを示しています。

FastAPIクエリ検証の詳細解説

高度なバリデーションオプション

FastAPIでは、複数のバリデーションオプションを提供しています。例えば、文字列の長さや正規表現によるパターンマッチングが可能です。

from fastapi import FastAPI, Query

app = FastAPI()

@app.get("/search/")
def search(q: str = Query(..., min_length=3, max_length=50, regex="^[a-zA-Z0-9]+$")):
    return {"query": q}

この例では、q3文字以上50文字以下であり、英数字のみで構成されていることを検証しています。

デフォルト値と必須パラメータの設定

クエリパラメータにはデフォルト値を設定することができ、これによりそのパラメータをオプションとすることができます。また、デフォルト値を設定しない場合、そのパラメータは必須となります。

from fastapi import FastAPI

app = FastAPI()

@app.get("/products/")
def get_products(page: int = 1, size: int = 10):
    return {"page": page, "size": size}

この例では、pagesize にデフォルト値が設定されているため、クライアントがこれらのパラメータを提供しなくてもエラーは発生しません。

複数のクエリパラメータの処理

複数のクエリパラメータを同時にバリデートすることも可能です。これにより、複雑なクエリ条件を簡潔に扱うことができます。

from fastapi import FastAPI, Query

app = FastAPI()

@app.get("/filter/")
def filter_items(
    name: str = Query(None, min_length=2),
    price: float = Query(None, ge=0.0),
    in_stock: bool = Query(True)
):
    return {"name": name, "price": price, "in_stock": in_stock}

この例では、namepricein_stock の各クエリパラメータに異なるバリデーションルールが適用されています。

FastAPIクエリ検証基礎と詳細解説まとめ

FastAPIを使用することで、クエリパラメータの定義とバリデーションが非常に簡単に行えます。Pydanticの力を借りて、入力データの整合性を保ちつつ、堅牢なAPIを構築することができます。適切なバリデーションを実装することで、アプリケーションの信頼性と安全性を高めることができます。

FastAPI文字列検証仕様と応用事例

文字列検証の概要

FastAPIでは、Pydanticモデルを使用してリクエストデータのバリデーションを行います。特に文字列の検証では、長さの制限や正規表現を用いたパターンマッチングなどが可能です。これにより、入力データの整合性を簡単に保つことができます。

検証の方法

文字列の検証は、PydanticのField関数を利用して行います。以下は、ユーザーの名前とメールアドレスを検証する例です。

from fastapi import FastAPI
from pydantic import BaseModel, Field, EmailStr

app = FastAPI()

class User(BaseModel):
    name: str = Field(..., min_length=3, max_length=50, description="ユーザーの名前")
    email: EmailStr = Field(..., description="有効なメールアドレス")

@app.post("/users/")
def create_user(user: User):
    return {"name": user.name, "email": user.email}

このコードでは、nameフィールドに対して最小長と最大長を設定し、emailフィールドには有効なメールアドレスかどうかを自動的に検証するEmailStr型を使用しています。これにより、不正なデータの入力を防ぐことができます。

応用事例

さらに高度な文字列検証として、パスワードの強度チェックを行うことができます。以下の例では、パスワードが少なくとも1つの大文字、小文字、数字、特殊文字を含むことを検証しています。

from fastapi import FastAPI
from pydantic import BaseModel, Field, validator
import re

app = FastAPI()

class UserRegistration(BaseModel):
    username: str = Field(..., min_length=3, max_length=30)
    password: str = Field(..., min_length=8)

    @validator('password')
    def password_strength(cls, v):
        if not re.search(r'[A-Z]', v):
            raise ValueError('パスワードは少なくとも1つの大文字を含めてください')
        if not re.search(r'[a-z]', v):
            raise ValueError('パスワードは少なくとも1つの小文字を含めてください')
        if not re.search(r'[0-9]', v):
            raise ValueError('パスワードは少なくとも1つの数字を含めてください')
        if not re.search(r'[!@#$%^&*(),.?":{}|<>]', v):
            raise ValueError('パスワードは少なくとも1つの特殊文字を含めてください')
        return v

@app.post("/register/")
def register(user: UserRegistration):
    return {"username": user.username, "message": "登録が成功しました"}

この例では、validatorデコレーターを使用してパスワードの各要件をチェックしています。条件を満たさない場合、適切なエラーメッセージが返されます。これにより、セキュアなパスワードの使用を強制することができます。

FastAPI文字列検証仕様と応用事例まとめ

FastAPIの文字列検証機能を活用することで、入力データの品質を高め、セキュリティを強化することができます。Pydanticモデルと組み合わせることで、柔軟かつ強力なバリデーションを簡単に実装できます。

FastAPIクエリパラ検証とエラー処理

クエリパラメータとは

FastAPIでは、クエリパラメータを使用して、APIエンドポイントに追加の情報を渡すことができます。クエリパラメータは、URLの末尾に?を付けて指定し、&で複数のパラメータを区切ります。例えば、/items/?skip=0&limit=10のようになります。

クエリパラメータの検証

クエリパラメータを検証することで、受け取るデータの型や範囲を制限し、予期しない入力を防ぐことができます。FastAPIでは、Pydanticモデルや型ヒントを使用して簡単に検証を行えます。

以下は、クエリパラメータの検証を行う例です。

from fastapi import FastAPI, Query
from typing import Optional

app = FastAPI()

@app.get("/items/")
def read_items(skip: int = Query(0, ge=0), limit: int = Query(10, le=100)):
    return {"skip": skip, "limit": limit}

この例では、skipパラメータは0以上の整数、limitパラメータは100以下の整数であることを指定しています。

エラー処理の方法

クエリパラメータが検証に失敗した場合、FastAPIは自動的に422 Unprocessable Entityのエラーレスポンスを返します。これにより、クライアントは入力エラーを迅速に認識できます。

しかし、さらにカスタマイズしたエラー処理が必要な場合は、例外ハンドラーを使用して独自のエラーメッセージを返すことができます。

以下は、カスタムエラーハンドラーの例です。

from fastapi import FastAPI, Query, HTTPException
from typing import Optional

app = FastAPI()

@app.get("/items/")
def read_items(skip: int = Query(0, ge=0), limit: int = Query(10, le=100)):
    if skip < 0:
        raise HTTPException(status_code=400, detail="Skip must be non-negative")
    if limit > 100:
        raise HTTPException(status_code=400, detail="Limit must not exceed 100")
    return {"skip": skip, "limit": limit}

この例では、skipが0未満、またはlimitが100を超える場合に、400 Bad Requestのエラーレスポンスを返すようにしています。

まとめ

FastAPIを使用すると、クエリパラメータの検証エラー処理が容易に行えます。Pydanticモデルや型ヒントを活用することで、入力データの整合性を保ちつつ、カスタマイズ可能なエラーハンドリングを実装できます。これにより、堅牢で信頼性の高いAPIを構築することが可能になります。

FastAPIクエリパラ検証とエラー処理まとめ

FastAPIでは、クエリパラメータの検証を簡単に実装でき、入力の整合性を確保することができます。また、デフォルトのエラーレスポンスに加えて、カスタムエラーハンドラーを用いることで、より具体的なエラーメッセージを提供できます。これにより、APIの信頼性とユーザー体験が向上します。

-FastAPI
-, ,