Как отправить http-запрос с несколькими аргументами данных - PullRequest
0 голосов
/ 14 ноября 2018

Когда 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)

отправьте http request, используя метод 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)
* 1011Сервер Flask регистрирует, что он получает словарь методом 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)

Журналы сервера Flask:

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 file, используя один и тот же requests.post метод:

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

Сервер регистрирует, что он получает файл, но не получает словарь json.

Можно ли отправить request с несколькимиаргументы данных: такие как 'json' и 'files'?

1 Ответ

0 голосов
/ 14 ноября 2018

Вы можете отправить несколько файловых объектов , используя параметр file и список.Тем не менее, ваши данные 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 является получателем загрузок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...