【问题标题】:Accepting multiple parameters in flask-restful add_resource()在 flask-restful add_resource() 中接受多个参数
【发布时间】:2018-06-14 05:02:24
【问题描述】:

我想在我的 Flask REST API 中处理一个 GET 请求。该请求将包含多个参数,您可以预期这是一个典型的 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() 中接受多个参数(其中一个是列表)。如何在 add_resource() 函数中接受它们以及如何在 get() 函数中解压它们?

我已经花时间对此进行逆向工程,但我还没有成功。难道我做错了什么?

(我知道可能有更好的方法来发送带有 REST API GET 请求的列表,所以我会很感激任何关于此的指针!) 提前真诚感谢!

【问题讨论】:

  • 您到底想要完成什么?为什么需要多个参数?
  • 我正在创建一个 REST API 建模 tradingview.com - 您发出 GET 请求,要求提供与股票价格相关的图表。如果您想在股票价格数据上绘制一条回归线,您可以在“类”变量中提及它,如下所示:'class=regr'。假设您还想要 MACD - 一种类似回归的分析工具 - 那么您也将传入 'class=macd'。因此 GET 请求将变为:localhost:5000/item/analysis=true&class=macd&class=regr

标签: python flask flask-restful


【解决方案1】:

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(',')

干杯!

【讨论】:

  • 我最终使用了parser.add_argument('analysis', type=str,...,然后使用了您的TRUTHY 方法,因为即使我通过curl http://localhost:5000/item -G -d "class=A,B" -d "analysis=False"if analysis: print("yeah") 也会打印yeah。所以我不确定如何正确处理布尔输出;一旦通过了某些事情,它似乎评估为True
  • 如果你使用 flask_restful input.boolean 它应该可以正常工作:from flask_restful import inputs 然后:add_argument('analysis', type=inputs.boolean, default=False, required=False, help='Enable analysis')
【解决方案2】:

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

它将被覆盖,所以只需使用一个字符串,例如:

class=A,B

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-24
    • 2015-12-22
    • 1970-01-01
    • 1970-01-01
    • 2020-02-17
    • 1970-01-01
    相关资源
    最近更新 更多