如何使用请求发送文件和数据?

时间:2015-11-03 17:04:54

标签: python python-requests

我试图通过python请求模块将python文件和一些json数据发送到服务器。以下是我的代码片段。

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上看到了类似的问题,但它们都给出了相同的错误代码。我试过了。

注意:我在服务器端使用Flask 0.10

UPDATE:客户端代码运行正常。 这是我的服务器端Flask代码很糟糕。它甚至给出了一条错误消息,说“&34; Bad Request&#34;

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问题。

感谢大家回答这个问题。

3 个答案:

答案 0 :(得分:2)

当我发布到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''}

答案 1 :(得分:1)

A 400表示请求格式错误。您发送到服务器的数据流不遵循规则,它期望某种类型的数据(比如JSON),但您发送的对象类型是a。它们都是不同的,请查看python的JSON module并在将来处理JSON对象时使用它们

答案 2 :(得分:0)

使用数据作为参数将其作为表单编码数据发送,而不是json,除非适当编码。 json.dumps(data)通常用于将python数据编码为json,但最近版本的Requests内置了json处理。

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

将作为json编码的字符串将job_data发送到服务器。