如何通过Flask请求文件属性获取Python字典
运行如何通过Flask请求文件属性获取Python字典,python,flask,request,python-requests,Python,Flask,Request,Python Requests,运行server.py时: from flask import Flask, request, Response app = Flask(__name__) @app.route('/test', methods=['GET','POST']) def route(): print('got files: %s' % request.files) return Response() if __name__ == '__main__': app.run('0.0
server.py
时:
from flask import Flask, request, Response
app = Flask(__name__)
@app.route('/test', methods=['GET','POST'])
def route():
print('got files: %s' % request.files)
return Response()
if __name__ == '__main__':
app.run('0.0.0.0', 5000)
使用client.py
发送请求:
import json, requests
dictionary_1 = {"file": {"url": "https://bootstrap.pypa.io/get-pip.py"}}
files = [('dictionary_1', ('get-pip.py', json.dumps(dictionary_1), 'application/json'))]
response = requests.post('http://127.0.0.1:5000/test', files=files)
服务器记录收到请求的情况:
got files: ImmutableMultiDict([('dictionary_1', <FileStorage: u'get-pip.py' ('application/json')>)])
get文件:ImmutableMultiDict([('dictionary_1',)])
显然,dictionary_1
作为FileStorage
对象接收。
如何将收到的文件存储
转换为Python字典
后来编辑
可能的重复帖子没有说明如何发送和解包通过
请求(files=list())
发送的Python dictionary对象,这是因为您发布的是文件而不是数据。这应该起作用:
import flask
app = flask.Flask(__name__)
@app.route('/test', methods=['GET','POST'])
def route():
print('got data: {}'.format(flask.request.json))
return Response()
if __name__ == '__main__':
app.run('0.0.0.0', 5000)
然后通过以下方式将数据发送到您的应用程序:
import requests
dictionary_1 = {"file": {"url": "https://bootstrap.pypa.io/get-pip.py"}}
response = requests.post('http://127.0.0.1:5000/test', json=dictionary_1)
在您的示例中,无需发布文件,除非我误解了某些内容解决方案#1:
解决方案#2:
我有意使用
requests.post(url,files=list())
而不是requests.post(url,json=str())
,因为我希望能够在同一请求中同时发送文件和字典。@您的请求不包括任何文件。客户机中的变量多个_文件
仅包含DICT、lists、,和字符串。由于我希望问题尽可能简单,多个_文件
列表仅包含字典对象,而不包含文件。您提到的帖子没有说明如何使用Flask.request.files属性发送和解包字典对象。
from flask import Flask, request, Response
import StringIO, json
app = Flask(__name__)
@app.route('/test', methods=['GET','POST'])
def route():
print('got files: %s' % request.files)
for key, file_storage in request.files.items():
string_io = StringIO.StringIO()
file_storage.save(string_io)
data = json.loads(string_io.getvalue())
print('data: %s type: %s' % (data, type(data)) )
return Response()
if __name__ == '__main__':
app.run('0.0.0.0', 5000)
from flask import Flask, request, Response
import tempfile, json, os, time
app = Flask(__name__)
@app.route('/test', methods=['GET','POST'])
def route():
print('got files: %s' % request.files)
for key, _file in request.files.items():
tmp_filepath = os.path.join(tempfile.mktemp(), str(time.time()))
if not os.path.exists(os.path.dirname(tmp_filepath)):
os.makedirs(os.path.dirname(tmp_filepath))
_file.save(tmp_filepath)
with open(tmp_filepath) as f:
json_data = json.loads(f.read())
print type(json_data), json_data
return Response(json_data)
if __name__ == '__main__':
app.run('0.0.0.0', 5000)