💭

python FlaskでPOSTを受け取るときのバリデーションのTips

2022/03/15に公開

この記事では、pythonを用いてPOSTリクエストを受け取り、値が入っているかを確かめる記述を短く書いてみるという内容です。メモ書き程度に思ってください。
また、POSTリクエストの送受信の仕方についての解説はないです。

・python
・Flask

all()について

今回はpythonの組み込み関数であるallを使います。詳細は省きますが、引数で渡した値が全てTrueならTrue、それ以外ならFalseを返す関数です。
https://note.nkmk.me/python-all-any-usage/

実際のコード

if request.method == 'POST':

    # リクエストの値を変数に格納
    request_json = request.json
    
    # リクエストに必須の項目名をタプルに入れる(後でこれとリクエストを比較する)
    required = (
      'username',
      'email',
      'tel',
      'age'
    )
    
    # requiredがrequest_jsonに入っているか判定
    if not all(k in request_json for k in required):
      return jsonify({'message': 'missing value'}), 400
    
    # ユーザーを生成
    is_created = User.create_user(
      request_json['username'],
      request_json['email'],
      request_json['tel'],
      request_json['age'])
      
    # レスポンスを返す
    if not is_created:
      return jsonify({'message': 'fail'}), 400
    return jsonify({'message':'success'}), 201

all(k in request_json for k in required)

今回メインとなるのは、all(k in request_json for k in required)の部分です。
pythonのall関数の引数にk in request_json for k in requiredを入れています。

要はk in request_json for k in requiredの部分が全てTrueになっていればTrue、一つでもFalseがあればFalseが返ります。

では、k in request_json for k in requiredについて詳しく見ていきます。

for k in required

この部分は、誰もがみたことがある普通のfor文です。
required の中に入っている値を一つずつkに入れていきます。
本来であれば、下記のように下にkを用いたコードを書いていきます。
requiredの中身を一つずつ取り出して、どれか一つでもrequest_jsonに入っていない値があったら400番を返すというコードです。

for k in required:
    if k in request_json:
	 return jsonify({'message': 'missing value'}), 400

しかしpythonでは、for文で渡す値を同じ行に記載することができます。

k for k in required

k for k in required のように記述することで、一つ目のkにfor文で渡したkを入れていくことができます。
例えば、下記のように書くと、arrayに配列が入ります。

array = [i for i in range(10)]

今回のケースでは、kに('username','email','tel','age')が入ります。

ここまで来れば後一歩です。

k in request_json for k in required

上記のコードにin request_jsonを入れます。

k "in request_json" for k in required

になる。
なんとなく入れる位置がおかしいように思いますが、k for k in requiredでは一つ目のkに対してfor文で回したkが入るので、一つ目のkに対してin request_jsonを入れることで判定をすることができます。
k in request_jsonについてはpythonのinの使い方について調べてください。request_jsonの中にkが入っているか判定しているだけです。
今回のケースでは、requiredに入れた判定基準を一つずつkに入れて、実際のリクエストであるrequest_jsonに入っているかを判定しています。

all(k in request_json for k in required)

上記を全てまとめると

  all(k in request_json for k in required)

になり、1行で必須項目の有無を判定できます。

Discussion