如何发送带有多个数据参数的http请求

时间:2018-11-14 00:50:21

标签: python http flask python-requests

运行flask_server.py

from flask import Flask, request, Response
import logging

logging.basicConfig(level=logging.DEBUG, 
                    format='%(levelname)s-%(message)s')

app = Flask(__name__)


@app.route('/test', methods=['GET','POST'])
def route():   
    logging.info('get_json: %s : %s' % (request.get_json(), type(request.get_json())))
    logging.info('files: %s : %s' % (request.files, type(request.files)))
    return Response()

if __name__ == '__main__':
    app.run('0.0.0.0', 5000)

使用request方法发送http requests.post,并为其提供Python dictionary作为json参数:

import json, requests    
dictionary = {"file": {"url": "https://bootstrap.pypa.io/get-pip.py"}}  
response = requests.post("http://127.0.0.1:5000/test", json=dictionary)

烧瓶服务器记录它使用Flask.request.get_json方法获取字典:

root - INFO - get_json: {u'file': {u'url': u'https://bootstrap.pypa.io/get-pip.py'}} : <type 'dict'>
root - INFO - files: ImmutableMultiDict([]) : <class 'werkzeug.datastructures.ImmutableMultiDict'>

同样,通过requests.post方法的files参数发送一个打开的文件对象。 Flask服务器将通过Flask.request.files属性获取它:

files = {'key_1': open('/any_file.txt', 'rb')}
response = requests.post(url, files = files)

烧瓶服务器日志:

root - INFO - get_json: None : <type 'NoneType'>
root - INFO - files: ImmutableMultiDict([('file_slot_1', <FileStorage: u'any_file.txt' (None)>)]) : <class 'werkzeug.datastructures.ImmutableMultiDict'>

最后,使用相同的dictionary方法发送open filerequests.post对象:

response = requests.post("http://127.0.0.1:5000/test",
                         json=dictionary, 
                         files=files)

服务器记录它获取文件但未获取json字典。

是否可以发送一个request并为其提供多个数据参数:例如“ json”和“ files”?

1 个答案:

答案 0 :(得分:1)

您可以使用file参数和列表发送multiple file objects。但是,您的json数据将需要在这些文件之一中。这是因为即使您只是在第一个请求中执行json=dictionary,它实际上仍在标头中发送Content-Type: application/json。如果要发送多个零件,则需要通过multipart/form-data使用files=<a list>

json_data = json.dumps({"file": {"url": "https://bootstrap.pypa.io/get-pip.py"}})
multiple_files = [
    ('targets', ('data.json', json_data, 'application/json')),
    ('targets', ('key_1', open('/any_file.txt', 'rb'), 'text/plain'))
]
response = requests.post(url, files=multiple_files)

此处目标的名称假定为targets。如果您的Flask应用是上传的接收者,则可以自己制作。