如何通过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)