【问题标题】:flask - how to get parameters from a JSON GET requestflask - 如何从 JSON GET 请求中获取参数
【发布时间】:2014-09-26 23:29:35
【问题描述】:

我有一个客户端 api,它发出以下 GET 请求:

"GET /tasks/5fe7eabd-842e-40d2-849e-409655e0891d?{%22task%22:%22hello%22,%22url%22:%22/tasks/5fe7eabd-842e-40d2-849e-409655e0891d%22}&_=1411772296171 HTTP/1.1" 200 -

在做

task = request.args
print task

显示它是

ImmutableMultiDict([('{"task":"hello","url":"/tasks/5fe7eabd-842e-40d2-849e-409655e0891d"}', u''), ('_', u'1411772296171')])

要获得“任务”值,如果我这样做:

  request.args.getlist('task')

我得到[] 而不是hello。关于如何从中挖掘出你好的任何想法?

【问题讨论】:

    标签: python json flask


    【解决方案1】:

    这里忽略request.args;你这里没有表单编码的查询参数。

    改用request.query_string,拆分缓存断路器(&_=<random number>),解码URL引用并将结果提供给json.loads()

    from urllib import unquote
    from flask import json
    
    data = json.loads(unquote(request.query_string.partition('&')[0]))
    task = data.get('task')
    

    演示:

    >>> request.query_string
    '{%22task%22:%22hello%22,%22url%22:%22/tasks/5fe7eabd-842e-40d2-849e-409655e0891d%22}&_=1411772296171'
    >>> from urllib import unquote
    >>> from flask import json
    >>> unquote(request.query_string.partition('&')[0])
    '{"task":"hello","url":"/tasks/5fe7eabd-842e-40d2-849e-409655e0891d"}'
    >>> json.loads(unquote(request.query_string.partition('&')[0]))
    {u'url': u'/tasks/5fe7eabd-842e-40d2-849e-409655e0891d', u'task': u'hello'}
    

    【讨论】:

      【解决方案2】:

      使用request object,你应该可以使用request.args.get('key', 'default')得到你想要的参数。

      request.args.get('task', None)
      

      【讨论】:

      • request.args.get('task', None)request.args.get('task') 返回值 None 而不是 hello