web-dev-qa-db-ja.com

Flask-restful add_resource()で複数のパラメーターを受け入れる

GETリクエストをFlask=REST API。で処理します。リクエストには複数のパラメーターが含まれます。これは典型的なGETリクエストであることが期待できます。 https:// localhost:5000/item/analysis = true&class = A&class = B

したがって、GET要求は次のもので構成されます。

  1. 「分析」と呼ばれるブール変数
  2. 「クラス」というリスト

次のようにadd_resource()内でこれを受け入れたいです。

add_resource(Item, '/item/<whatever-comes-here>')

Add_resource()内で複数のパラメーター(そのうちの1つはリスト)を受け入れる方法についてはわかりません。 add_resource()関数でそれらを受け入れ、get()関数内でそれらをアンパックするにはどうすればよいですか?

これをリバースエンジニアリングに費やしましたが、まだ成功していません。私は何か間違っていますか?

(REST API GETリクエストでリストを送信するより良い方法があるかもしれないことを理解しているので、それに関するポインタを感謝します!)よろしくお願いします!

10
Omkar Neogi

URLパラメータは?の後に定義されるため、URLは次のようになります。

https:// localhost:5000/item?analysis = true&class = A&class = B

このようなURLパラメーターには、add_resourceで何も指定する必要はありません。

API GETメソッドでFlaskrequestプロキシオブジェクトからパラメーターを取得できます。

from flask import Flask, request
from flask_restful import Api, Resource

app = Flask(__name__)
api = Api(app)

# Flask mishandles boolean as string
TRUTHY = ['true', 'True', 'yes']

class Item(Resource):
   def get():
      # Get `class` list from request args
      classes = request.args.getlist('class') 

      # Get `analysis` boolean from request args
      analysis = True if request.args.get('analysis') in TRUTHY else False

api.add_resource(Item, '/item')

受信できるパラメーターの柔軟性を高めるには、Flask Restful独自の here のようなリクエストパーサーを使用してリクエストを解析します。

コードは次のようになります。

from flask import Flask
from flask_restful import Api, Resource, reqparse

app = Flask(__name__)
api = Api(app)

# Define parser and request args
parser = reqparse.RequestParser()
parser.add_argument('class', type=list)
parser.add_argument('analysis', type=bool, default=False, required=False, help='Enable analysis')

class Item(Resource):
   def get():
       args = parser.parse_args()
       classes = args['class']  # List ['A', 'B']
       analysis = args['analysis'] # Boolean True

api.add_resource(Item, '/item')

最後に、リストのよりコンパクトな形式が望ましい場合があります(たとえば、URLサイズの制限)。その場合、コンマ区切りリストをよく使用します。 https:// localhost:5000/item?analysis = true&class = A、B

リクエストパーサーでは、文字列のように受け入れて、 '、'で分割します。

parser.add_argument('class', type=str)
...
classes = args['class'].split(',')

乾杯!

10
JahMyst

クエリ文字列はその方法で使用できません。

上書きされるため、次のような文字列を使用します。

class=A,B
0
CheStar