【问题标题】:Flask-restful: how to pass multi value params to a GET request?Flask-restful:如何将多值参数传递给 GET 请求?
【发布时间】:2015-10-22 15:26:45
【问题描述】:

根据documentation,这足以传入一个多值。

def __init__(self):
        super(LatestNewsAPI, self).__init__()
        self.req_parser = reqparse.RequestParser()
        self.req_parser.add_argument('date', type=str)
        self.req_parser.add_argument('media', action='append')

我试图将两个媒体附加到一个列表中:

    rss_date_time = parser.parse('Tue, 15 Jan 2015 18:13:00 GMT')
    param = {'date': rss_date_time, 'media': 'GRD', 'media': 'IND'}
    url = '/api/v1.0/latest_news/?{0}'.format(urllib.urlencode(param))
    rv = self.client.get(url, headers={},
                         environ_base={'REMOTE_ADDR': '127.0.0.1'})

但是一旦我到达那里:

def get(self):
    args = self.req_parser.parse_args()
    date_str = args['date']
    date_time = parser.parse(date_str)
    media = args['media']

媒体仅包含[u'IND']

请问我错过了什么?

【问题讨论】:

    标签: python flask flask-restful


    【解决方案1】:

    你应该使用一个数组:

     param = {'date': rss_date_time, 'media[]': ['GRD', 'IND']}
    

    在 Python 中,它们实际上被称为 list

    编辑:

    同样,你应该使用

    media = args['media[]']
    

    而不是在接收方。

    【讨论】:

    • 谢谢,但现在我收到了[u"['GRD', 'IND']"]。列表中的列表。我还用更多细节扩展了这个问题。
    • 我现在得到:None 用于媒体。你看到我的问题的更新了吗?谢谢
    • 我怀疑是否有必要将[] 放在参数名称中。通常保存请求数据的结构有一个getlist() 方法(例如request.form.getlist('some_key')),它总是返回为该键传递的所有值的列表。
    【解决方案2】:

    这种情况下其实是urllib的问题:

    我只需要添加doseq=True

    url = '/api/v1.0/latest_news/?{0}'.format(urllib.urlencode(param, doseq=True))
    

    并将参数更改为列表:

    param = {'date': rss_date_time, 'media': ['GRD', 'IND']}
    

    现在我得到[u'GRD', u'IND']

    【讨论】: