Преобразуйте команду curl с файлами форм в запросы python - PullRequest
0 голосов
/ 06 января 2020

У меня есть следующая команда curl:

curl -X POST "_my_username_:_my_password_@10.2.25.209:5601/api/saved_objects/_import" -H "kbn-xsrf: true" --form file=@V:kibana\IndexPatterns\events.ndjson

, которая прекрасно работает (импортировать шаблон индекса вasticsearch), но я пытаюсь преобразовать его в Python запросы. Я пробовал несколько способов, включая следующие:

files = {'file': '@' + args.kibana_index_pattern_path}
res = requests.post("http://{0}:{1}@{2}:5601/api/saved_objects/_import".format(args.elastic_username, args.elastic_password, args.kibana_host),
                    headers={'kbn-xsrf': 'true'}, data=files)


files = {'file': '@' + args.kibana_index_pattern_path}
res = requests.post("http://{0}:{1}@{2}:5601/api/saved_objects/_import".format(args.elastic_username, args.elastic_password, args.kibana_host),
                    headers={'kbn-xsrf': 'true', 'Content-Type': 'text/plain'}, files=files)

С различными комбинациями с или без @, файлы в виде одной строки вместо словаря, т. Д. Я продолжаю получать сообщения об ошибках и недопустимых типах содержимого (например: {'message': 'Unsupported Media Type', 'error': 'Unsupported Media Type', 'statusCode': 415}).

Обратите внимание, что есть некоторые инструменты для преобразования curl в запросы, но все те, которые я пробовал, не распознают параметр файла, игнорируя его или выбрасывая исключение. Однако сама команда работает.

Что я здесь не так делаю?

1 Ответ

0 голосов
/ 06 января 2020

Попробуйте следующее:

import requests
from requests.auth import HTTPBasicAuth

username = '_my_username_'
password = '_my_password_'
headers = {'kbn-xsrf': 'true'}
upload_url = "http://10.2.25.209:5601/api/saved_objects/_import"
files = {'file': open('V:\algotec\analytics\install\Kibana\IndexPatterns\events.ndjson', 'rb')}

r = requests.post(upload_url, headers=headers, auth=HTTPBasicAuth(username, password), files=files)
print(r.status_code)

Если вы получили неверный запрос с этой ошибкой

error: «Bad Request», сообщение: «Запрос должен содержать kbn- Заголовок xsrf. '

Измените информацию заголовка согласно приведенному ниже и повторите попытку.

headers = {
  'Content-Type': 'application/x-ndjson',
  'kbn-xsrf': 'anything',
  'Accept': 'application/x-ndjson'
}
...