接受Flaskrestful add_resource()中的多个参数

2024-04-27 03:54:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我想在我的Flask REST API中处理GET请求。请求将包含多个参数,您可以预期这是一个典型的GET请求: https://localhost:5000/item/analysis=true&class=A&class=B

因此,GET请求包括:

  1. 名为“analysis”的布尔变量
  2. 一个叫做“类”的列表

我想在add_resource()中接受它,如下所示:

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

我不知道如何在add_resource()中接受多个参数(其中一个是列表)。如何在add_resource()函数中接受它们,如何在get()函数中解压它们?

我花了很多时间来逆向工程,但是我还没有成功。我做错什么了吗?

(我知道可能有更好的方法来发送带有REST API GET请求的列表,所以我希望能有任何相关的指针!) 提前致以诚挚的谢意!


Tags: 函数httpsaddrestapilocalhostflask列表
2条回答

查询字符串不能这样使用。

它将被覆盖,因此只需使用以下字符串:

class=A,B

URL参数是在?之后定义的,因此您的URL应该是:

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

您不必在add_resource中为此类URL参数指定任何内容。

您可以从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(',')

干杯!

相关问题 更多 >