# バリデーション

Webアプリケーションで最もよく実装される機能の1つが、ユーザー入力の検証です。明らかな理由により、これはセキュリティ上の問題であるだけでなく、単なるグッドプラクティスでもあります。データが期待通りのものであることを確認し、そうでない場合は 400 応答を投げるようにしたいものです。

# インプリメンテーション

# データクラスによる検証

データクラス (opens new window) の導入により、Pythonは定義されたスキーマを満たすオブジェクトをとても簡単に作成することができるようになりました。しかし、標準ライブラリは型チェックの検証のみをサポートし、実行時の検証はサポートしていません。Sanic Extensionsはdataclassesを使って、入力されたリクエストに対して実行時の検証を行う機能を追加します。

まず、モデルを定義する。

@dataclass
class SearchParams:
    q: str

そして、ルートに添付。

from sanic_ext import validate
@app.route("/search")
@validate(query=SearchParams)
async def handler(request, query: SearchParams):
    return json(asdict(query))

これで、受信したリクエストのバリデーションが行われたはずです。

$ curl localhost:8000/search                                       
⚠️ 400 — Bad Request
====================
Invalid request body: SearchParams. Error: missing a required argument: 'q'
$ curl localhost:8000/search\?q=python                             
{"q":"python"}

# Pydanticを使ったバリデーション

WARNING

現在、PydanticモデルをサポートしているのはJSONボディの検証のみです。

Pydanticモデルの使用もできます。

まず、モデルを定義する。

class Person(BaseModel):
    name: str
    age: int

そして、ルートに添付。

from sanic_ext import validate
@app.post("/person")
@validate(json=Person)
async def handler(request, body: Person):
    return json(body.dict())

これで、受信したリクエストのバリデーションが行われたはずです。

$ curl localhost:8000/person -d '{"name": "Alice", "age": 21}' -X POST  
{"name":"Alice","age":21}

# 何が検証できるのか?

validate デコレータを使用すると、3つの場所から入力されたユーザーデータを検証することができます。JSON の本文(request.json)、フォームの本文(request.form)、そしてクエリパラメータ(request.args) です。

予想通り、デコレータのキーワード引数を使ってモデルをアタッチすることができます。

@validate(
    json=ModelA,
    query=ModelB,
    form=ModelC,
)
MIT Licensed
Copyright © 2018-present Sanic Community Organization

~ Made with ❤️ and ☕️ ~