2015-11-03 2 views
0

Я пытаюсь отправить файл python и некоторые данные json на сервер через модуль запросов python. Ниже приведен фрагмент моего кода.Как отправить файл и данные с помощью запросов?

files = {'file': (FILE, open('test_hello.py', 'rb'), 'text/plain')} 
job_data = dict(name='nice', interval=50, script_path="crap") 
r = post(url=url, data=job_data, files=files) 

r.status_code 
400 

r.text 
u'<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">\n<title>400 Bad Request</title>\n<h1>Bad Request</h1>\n<p>The browser (or proxy) sent a request that this server could not understand.</p>\n' 

Я получаю код статуса 400. Может кто-нибудь указать, что мне здесь не хватает? Или поделиться правильным фрагментом кода?

PS: Я видел похожие вопросы в stackoverflow, но все они дают одинаковый код ошибки. Я попробовал их.

Примечание: Я использую флягу 0.10 на стороне сервера

UPDATE: Клиентский код работает нормально. Это был мой код на стороне сервера, который был плохим. Он даже дал сообщение об ошибке, говорящее «Bad Request»

r.text 
400 Bad Request</title>\n<h1>Bad Request</h1>\n<p>The browser (or proxy) sent a request that this server could not understand.' 

Это сообщение об ошибке заставило меня думать, что на стороне клиента код не работает, как ожидалось, даже несмотря на его внешний вид хорошо и похож на другие вопросы, StackOverflow я попробовал.

Спасибо всем, что ответит на вопрос.

ответ

1

400 означает, что запрос был искажен. Поток данных, отправленный вами на сервер, не соответствовал правилам, он ожидает данные определенного типа (скажем, JSON), но тип объекта, который вы отправляете, является. Они оба разные и проверяют python's JSON module и используют их в будущем при работе с объектами JSON.

0

Использование данных в качестве параметра отправляет его в виде данных, закодированных в форме, не как json, если только не закодировано. json.dumps(data) обычно используются для кодирования данных питона как JSON, но последние версии Requests имеет обработку JSon встраивается.

r = post(url=url, json=job_data, files=files) 

отправит job_data на сервер в виде JSON закодированных строк.

1

Ваш код работает так, как написано при отправке POST на httpbin. Независимо от того, какая служба вы отправляете данные, вы ожидаете чего-то еще, но, не зная, чего она ожидает, мы не можем помочь дальше.

>>> import requests 
>>> url = 'http://httpbin.org/post' 
>>> files = {'file': ('test_hello.py', open('test_hello.py', 'rb'), 'text/plain')} 
>>> job_data = dict(name='nice', interval=50, script_path="crap") 
>>> r = requests.post(url=url, data=job_data, files=files) 
>>> r.status_code 
200 
>>> r.json() 
{u'files': {u'file': u"print 'hi'\n"}, u'origin': u'208.91.164.254', u'form': {u'script_path': u'crap', u'interval': u'50', u'name': u'nice'}, u'url': u'http://httpbin.org/post', u'args': {}, u'headers': {u'Content-Length': u'462', u'Accept-Encoding': u'gzip, deflate', u'Accept': u'*/*', u'User-Agent': u'python-requests/2.8.1', u'Host': u'httpbin.org', u'Content-Type': u'multipart/form-data; boundary=8064073dc3f1449cb3e46a7a6c5669a3'}, u'json': None, u'data': u''} 
+0

Спасибо, что поделились этой техникой устранения неполадок. Я понял, что мой клиентский код работает. Это была моя ERROR-серверная сторона, которая вводит меня в заблуждение. –

Смежные вопросы