【问题标题】:How to get Json object from GETrequest in FLASK如何从 FLASK 中的 GETrequest 获取 Json 对象
【发布时间】:2015-06-22 00:50:02
【问题描述】:

我的服务器是烧瓶,我的客户端是 javascript,我正在使用 jquery - ajax 向服务器发送数据。我能够从 POST 请求中获取 JSON 对象,但无法通过 GET 获取。

来自 Javascript 客户端的请求:

$.ajax({type: 'GET',
        url: "/checkForTrain",
        data: jsonObj,
        success: function(response){
            response = JSON.parse(response)
            if(response['status']==='success')
                postDataset(data)
            else
                handleError(data)
        },
        error :   function(response){
            console.log(response)
        }
    })

在烧瓶中处理请求的url:

@app.route('/checkForTrain',methods=['GET','OPTIONS'])
def checkForTrain():
    print request
    json_str=u''+str(request.get_data())
    print json_str,' <--- json data'
    dataSearch = json.loads(json_str)
    print dataSearch,' <--- dictionary'
    obj = dbWrapper.checkForTrain(dataSearch['name'],dataSearch['type'])
    return obj

打印请求的输出:

<Request 'http://localhost:5000/checkForTrain?{"name":"lel","technique":"regression"}' [GET]>

从 print json_str 中输出,'

<--- json data

服务器的堆栈跟踪:

Traceback (most recent call last):
  File "/home/adminuser/Desktop/Github/DataMining/DataMiningProject/lib/python2.7/site-packages/flask/app.py", line 1836, in __call__
    return self.wsgi_app(environ, start_response)
  File "/home/adminuser/Desktop/Github/DataMining/DataMiningProject/lib/python2.7/site-packages/flask/app.py", line 1820, in wsgi_app
    response = self.make_response(self.handle_exception(e))
  File "/home/adminuser/Desktop/Github/DataMining/DataMiningProject/lib/python2.7/site-packages/flask/app.py", line 1403, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "/home/adminuser/Desktop/Github/DataMining/DataMiningProject/lib/python2.7/site-packages/flask/app.py", line 1817, in wsgi_app
    response = self.full_dispatch_request()
  File "/home/adminuser/Desktop/Github/DataMining/DataMiningProject/lib/python2.7/site-packages/flask/app.py", line 1477, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/home/adminuser/Desktop/Github/DataMining/DataMiningProject/lib/python2.7/site-packages/flask/app.py", line 1381, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/home/adminuser/Desktop/Github/DataMining/DataMiningProject/lib/python2.7/site-packages/flask/app.py", line 1475, in full_dispatch_request
    rv = self.dispatch_request()
  File "/home/adminuser/Desktop/Github/DataMining/DataMiningProject/lib/python2.7/site-packages/flask/app.py", line 1461, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/home/adminuser/Desktop/Github/DataMining/DataMiningProject/app/routes.py", line 53, in checkForTrain
    dataSearch = json.loads(json_str)
  File "/usr/lib/python2.7/json/__init__.py", line 338, in loads
    return _default_decoder.decode(s)
  File "/usr/lib/python2.7/json/decoder.py", line 366, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/usr/lib/python2.7/json/decoder.py", line 384, in raw_decode
    raise ValueError("No JSON object could be decoded")

【问题讨论】:

    标签: jquery python ajax json flask


    【解决方案1】:

    您需要提取查询字符串;您可以使用request.query_string attribute 访问它;你必须手动unquote它:

    From urllib import unquote
    
    json_str = unquote(request.query_string)
    

    然后你的视图输出:

    <Request 'http://localhost:5000/checkForTrain?{"name":"lel","technique":"regression"}' [GET]>
    {"name":"lel","technique":"regression"}  <--- json data
    {u'technique': u'regression', u'name': u'lel'}  <--- dictionary
    

    request.get_data() method 只能用于访问请求正文,而GET 请求永远不会有正文。

    如果您的数据仅包含键值对,那么坚持对它们进行表单编码并坚持使用 Flask 的 request.args 功能而不是在这里使用 JSON 可能会更容易。

    【讨论】:

    • 谢谢,但是输出是 {%22name%22:%22ded%22,%22technique%22:%22regression%22}
    • 对于那些也遇到我的问题的人来说,我的论点也是错误的,就像@Martijn 说 Get 永远没有主体,我在传递 JSON 对象作为参数时应该传递查询字符串和我的网址应该是localhost:5000/checkForTrain?name=lel&technique=regression
    • @Dilz:对,该值是原始 URL 组件,因此需要取消引用;为此更新。在查询字符串中使用常规的表单编码键值对可能会更简单。
    猜你喜欢
    • 2015-10-05
    • 1970-01-01
    • 1970-01-01
    • 2022-09-27
    • 1970-01-01
    • 1970-01-01
    • 2015-10-05
    • 2020-02-17
    • 1970-01-01
    相关资源
    最近更新 更多