如何在Flask RESTful API应用程序中访问json POST数据

问题描述 投票:1回答:1

我目前无法尝试访问一个RESTful API应用程序中的POST json数据。 POST数据只是一个使用pandas.to_json()方法转换为json对象的Pandas数据帧。

import pandas as pd
from flask import Flask, request, jsonify
from flask_restful import Resource, Api


app = Flask(__name__)
api = Api(app)

# Creation Of Main Endpoint Classes
class Test(Resource):
    def post(self):

        # Get POST data as json & read it as a DataFrame
        new_x = request.get_json()

        current_data = pd.read_json(new_x)
        return {'message': 'POST data read successfully'}

# Addition of the Endpoint Classes As Endpoints For The RESTFul API
api.add_resource(Test, '/api/v1')


if __name__ == '__main__':
    app.run(debug=True)

在对此Test端点发出POST请求后,我收到JSONDecodeError: Expecting value错误。该帖子是使用请求python库制作的:

import requests
new_json = df.to_json()
post_url = 'http://127.0.0.1:5000/api/v1'
post_r = requests.post(url=post_url, data=new_json_orient)
print(post_r.json())

堆栈跟踪似乎指出request.get_json()返回带有<class 'NoneType'>的None。因此,熊猫无法阅读无。熊猫和我错过了POST数据的位置。

127.0.0.1 - - [08/Mar/2019 13:06:56] "POST /api/v1 HTTP/1.1" 500 -
Traceback (most recent call last):
  File "C:\Users\..\AppData\Local\Continuum\anaconda3\envs\..\lib\site-packages\flask\app.py", line 2309, in __call__
    return self.wsgi_app(environ, start_response)
  File "C:\Users\..\AppData\Local\Continuum\anaconda3\envs\..\lib\site-packages\flask\app.py", line 2295, in wsgi_app
    response = self.handle_exception(e)
  File "C:\Users\..\AppData\Local\Continuum\anaconda3\envs\..\lib\site-packages\flask_restful\__init__.py", line 273, in error_router
    return original_handler(e)
  File "C:\Users\..\AppData\Local\Continuum\anaconda3\envs\..\lib\site-packages\flask\app.py", line 1741, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "C:\Users\..\AppData\Local\Continuum\anaconda3\envs\..\lib\site-packages\flask\_compat.py", line 34, in reraise
    raise value.with_traceback(tb)
  File "C:\Users\..\AppData\Local\Continuum\anaconda3\envs\..\lib\site-packages\flask\app.py", line 2292, in wsgi_app
    response = self.full_dispatch_request()
  File "C:\Users\..\AppData\Local\Continuum\anaconda3\envs\..\lib\site-packages\flask\app.py", line 1815, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "C:\Users\..\AppData\Local\Continuum\anaconda3\envs\..\lib\site-packages\flask_restful\__init__.py", line 273, in error_router
    return original_handler(e)
  File "C:\Users\..\AppData\Local\Continuum\anaconda3\envs\..\lib\site-packages\flask\app.py", line 1718, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "C:\Users\..\AppData\Local\Continuum\anaconda3\envs\..\lib\site-packages\flask\_compat.py", line 34, in reraise
    raise value.with_traceback(tb)
  File "C:\Users\..\AppData\Local\Continuum\anaconda3\envs\..\lib\site-packages\flask\app.py", line 1813, in full_dispatch_request
    rv = self.dispatch_request()
  File "C:\Users\..\AppData\Local\Continuum\anaconda3\envs\..\lib\site-packages\flask\app.py", line 1799, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "C:\Users\..\AppData\Local\Continuum\anaconda3\envs\..\lib\site-packages\flask_restful\__init__.py", line 480, in wrapper
    resp = resource(*args, **kwargs)
  File "C:\Users\..\AppData\Local\Continuum\anaconda3\envs\..\lib\site-packages\flask\views.py", line 88, in view
    return self.dispatch_request(*args, **kwargs)
  File "C:\Users\..\AppData\Local\Continuum\anaconda3\envs\..\lib\site-packages\flask_restful\__init__.py", line 595, in dispatch_request
    resp = meth(*args, **kwargs)
  File "C:\Users\..\Documents\..\app.py", line 35, in post
    current_data = pd.read_json(new_x)
  File "C:\Users\..\AppData\Local\Continuum\anaconda3\envs\..\lib\site-packages\pandas\io\json\json.py", line 413, in read_json
    path_or_buf, encoding=encoding, compression=compression,
  File "C:\Users\..\AppData\Local\Continuum\anaconda3\envs\..\lib\site-packages\pandas\io\common.py", line 232, in get_filepath_or_buffer
    raise ValueError(msg.format(_type=type(filepath_or_buffer)))
ValueError: Invalid file path or buffer object type: <class 'NoneType'>

我究竟做错了什么?如何访问new_json POST数据?提前致谢。

python-3.x python-requests flask-restful
1个回答
1
投票

这很可能是因为POST方法不包含任何关于它的Content-Type的信息。

  1. 如果requests版本比2.4.2更新,你可以使用json而不是data作为帖子体(请参阅doc details)。这将自动设置标头'Content-Type': 'application/json'
post_r = requests.post(url=post_url, json=new_json_orient)
  1. 如果您使用的请求较旧,则可以将标头值明确设置为:
headers = {'Content-type': 'application/json'}
post_r = requests.post(url=post_url, data=new_json_orient, headers=headers)

附:有关Content-Type标题的更多信息,请参阅此文章中的MDN docs标题,这里是qazxswpoi的链接。

© www.soinside.com 2019 - 2024. All rights reserved.