如何在 Flask RESTful API 应用程序中访问 json POST 数据
How to access a json POST data in Flask RESTful API app
我目前无法访问 Flask RESTful API 应用程序中的 POST json 数据。 POST 数据只是使用 pandas.to_json()
方法将 Pandas 数据帧转换为 json 对象。
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)
向此测试端点发出 POST 请求后,我收到 JSONDecodeError: Expecting value
错误。 post 是通过请求 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()
returns 一个 None 和 <class 'NoneType'>
。 Pandas,结果无法读取 None。 Pandas 并且我缺少 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 数据?提前致谢。
这很可能是因为 POST
方法不包含它的 Content-Type
的任何信息。
- 如果
requests
版本比 2.4.2 更新,您可以使用 json
而不是 data
for post body(参见 doc details 这里)。这将自动设置 header 'Content-Type': 'application/json'
:
post_r = requests.post(url=post_url, json=new_json_orient)
- 如果您的使用请求较早,您可以将 header 值明确设置为:
headers = {'Content-type': 'application/json'}
post_r = requests.post(url=post_url, data=new_json_orient, headers=headers)
P.S。有关 Content-Type
header 在 post 中提到的更多信息,这里是 MDN docs.
的 link
我目前无法访问 Flask RESTful API 应用程序中的 POST json 数据。 POST 数据只是使用 pandas.to_json()
方法将 Pandas 数据帧转换为 json 对象。
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)
向此测试端点发出 POST 请求后,我收到 JSONDecodeError: Expecting value
错误。 post 是通过请求 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()
returns 一个 None 和 <class 'NoneType'>
。 Pandas,结果无法读取 None。 Pandas 并且我缺少 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 数据?提前致谢。
这很可能是因为 POST
方法不包含它的 Content-Type
的任何信息。
- 如果
requests
版本比 2.4.2 更新,您可以使用json
而不是data
for post body(参见 doc details 这里)。这将自动设置 header'Content-Type': 'application/json'
:
post_r = requests.post(url=post_url, json=new_json_orient)
- 如果您的使用请求较早,您可以将 header 值明确设置为:
headers = {'Content-type': 'application/json'}
post_r = requests.post(url=post_url, data=new_json_orient, headers=headers)
P.S。有关 Content-Type
header 在 post 中提到的更多信息,这里是 MDN docs.