質問: request.args.get('id') ``` とコードを書きました。 例えばlocalhost:8000/my-route?id=aDj1948と urlを書いて実行できます。request.argsのパラメータが正しい型か制御文字を含んでいないか、故意に書き換えられるようになっていないかの3点をvalidationをidパラメータに対してかけたいです。 Formの中身に対してのvalidationの方法しか検索しても見つからず、やりたいことを実装するにはどのようにコードを書けばいいのでしょうか?
回答: > > request.argsのパラメータが > > 1. 正しい型か > > 2. 制御文字を含んでいないか、 > > 3. 故意に書き換えられるようになっていないか > > の3点をvalidationをidパラメータに対してかけたいです。 > > > ご質問の1、2については、 本家のstackoverflowに類似の質問がありました。 How to validate URL parameters in Flask app? 上記の質問では、voluptuousというライブラリを使う方法で解決されたようです。 使い方の例としては、以下になります。 ``` from voluptuous import Schema, Required, All, Range, Coerce, MultipleInvalid schema = Schema({ # idパラメータは必須で、値が intに変換可能 かつ 1000〜2000の範囲内 Required('id'): All(Coerce(int), Range(min=1000, max=2000)), }) # パラメータが正しい場合 # schema(request.args) schema({'id': '1948'}) # => {'id': 1948} # パラメータが不正な場合、MultipleInvalid例外が発生 try: schema({'id': 'aDj1948'}) except MultipleInvalid as e: str(e) # => expected int for dictionary value @ data['id'] ``` ご質問の「3. 故意に書き換えられるようになっていないか」については、改竄をチェックしたいという意味であれば、別途、改竄防止の仕組み(署名のパラメータを追加するなど)を検討する必要があります。