Python 2.7 尝试使用python请求模块发出post请求时出现http 500错误

Python 2.7 尝试使用python请求模块发出post请求时出现http 500错误,python-2.7,http,python-requests,Python 2.7,Http,Python Requests,我有一个python(python2.7)脚本,它使用requests模块向我在本地主机上运行的web应用程序发帖。需要填写的表单有数据区和文件上传区 import requests root = "http://localhost/qatrack/" test_list_url =root+"qa/utc/perform/17/day=next&next=/qatrack/qa/unit/7/" s = requests.Session() s.get(login_url) token

我有一个python(python2.7)脚本,它使用requests模块向我在本地主机上运行的web应用程序发帖。需要填写的表单有数据区和文件上传区

import requests
root = "http://localhost/qatrack/"
test_list_url =root+"qa/utc/perform/17/day=next&next=/qatrack/qa/unit/7/"
s = requests.Session()
s.get(login_url)
token = s.cookies['csrftoken']
login_data = {
    'username':'user',
    'password':'pass',
    'csrfmiddlewaretoken': token
}
login_resp = s.post(login_url, data=login_data)
data1=open('C:/deploy/qatrackplus/python/imgs/test1.png','rb')
data2=open('C:/deploy/qatrackplus/python/imgs/test2.png','rb')
test_data = {
    'csrfmiddlewaretoken': token,
    "work_started":timestr,
    "work_completed":timestr,
    "status":"1",
    "form-TOTAL_FORMS":"4",
    "form-INITIAL_FORMS":"4",
    "form-MAX_NUM_FORMS":"1000",
    "form-0-value":"5"
}
f={
    "form-1-string_value":data1,
    "form-2-string_value":data2
}
resp = s.post(test_list_url, data=test_data, files=f)

响应给出了500个错误代码,当我将输入放入.html文件时,它会说web应用程序的一个脚本中存在属性错误。如果我为没有需要填写的文件上载的表单运行脚本,我不会得到这个结果。

我认为您的问题来自如何将
data1
data2
传递到表单。您正在对图像文件调用
open()
,但这本身不会提供任何数据。它为您提供了一个文件读取器对象。要从流中获取数据,您需要使用类似于
read()
的方法从流中实际获取数据,以便可以继续传递。

我认为您的问题来自如何将
data1
data2
传递到表单。您正在对图像文件调用
open()
,但这本身不会提供任何数据。它为您提供了一个文件读取器对象。要从流中获取数据,您需要使用类似于
read()
的方法从流中实际获取数据,以便您可以将其传递。

作为对此的更新,我已经找到了解决方案。它正在查找文件名,但基于web应用程序的上载机制,它正在文件夹C:/deploy/../media/uploads/tmp/中查找文件名。保存要上载的文件后,删除post请求中的files=f参数,并将测试数据表提交为:

test_data = {
  'csrfmiddlewaretoken': token,
  "work_started":timestr,
  "work_completed":timestr,
  "status":"1",
  "form-TOTAL_FORMS":"3",
  "form-INITIAL_FORMS":"3",
  "form-MAX_NUM_FORMS":"1000",
  "form-0-value":"5"
  "form-1-string_value":test1.png #saved in C:/deploy/.../media/uploads/tmp/
  "form-2-string_value":test2.png
}
 resp = s.post(test_list_url, data=test_data)

根据需要上传文件。谢谢你的帮助

作为更新,我已经找到了解决方案。它正在查找文件名,但基于web应用程序的上载机制,它正在文件夹C:/deploy/../media/uploads/tmp/中查找文件名。保存要上载的文件后,删除post请求中的files=f参数,并将测试数据表提交为:

test_data = {
  'csrfmiddlewaretoken': token,
  "work_started":timestr,
  "work_completed":timestr,
  "status":"1",
  "form-TOTAL_FORMS":"3",
  "form-INITIAL_FORMS":"3",
  "form-MAX_NUM_FORMS":"1000",
  "form-0-value":"5"
  "form-1-string_value":test1.png #saved in C:/deploy/.../media/uploads/tmp/
  "form-2-string_value":test2.png
}
 resp = s.post(test_list_url, data=test_data)


根据需要上传文件。谢谢你的帮助

那么,您的文件上传处理中可能有一个bug。如果没有这些代码,我们无法告诉您为什么会得到500。请查看本地web服务的日志,看看是什么导致了500错误。代码很长,它卡住的部分是:def add_history(self,forms):“将历史值粘贴到单元测试信息(丑陋)”history,history\u dates=self.unit\u test\u col.history()self.history\u dates=history\u forms中表单的日期:对于测试,历史记录中的hist:if test==form.unit\u test\u info.test:form.history=histbreak@OhAuth日志只是说有一个对url的POST请求,并做出了500个响应。在我得到一个html输出之前,它说没有属性,但现在已经停止了。那么,在你的文件上传处理中可能有一个bug。如果没有这些代码,我们无法告诉您为什么会得到500。请查看本地web服务的日志,看看是什么导致了500错误。代码很长,它卡住的部分是:def add_history(self,forms):“将历史值粘贴到单元测试信息(丑陋)”history,history\u dates=self.unit\u test\u col.history()self.history\u dates=history\u forms中表单的日期:对于测试,历史记录中的hist:if test==form.unit\u test\u info.test:form.history=histbreak@OhAuth日志只是说有一个对url的POST请求,并做出了500个响应。在我得到一个html输出之前,它说没有属性,但现在已经停止了。那么,在你的文件上传处理中可能有一个bug。如果没有这些代码,我们无法告诉您为什么会得到500。请查看本地web服务的日志,看看是什么导致了500错误。代码很长,它卡住的部分是:def add_history(self,forms):“将历史值粘贴到单元测试信息(丑陋)”history,history\u dates=self.unit\u test\u col.history()self.history\u dates=history\u forms中表单的日期:对于测试,历史记录中的hist:if test==form.unit\u test\u info.test:form.history=histbreak@OhAuth日志只是说有一个对url的POST请求,并做出了500个响应。在我得到一个html输出之前,它说没有属性,但现在它已经停止了,我更改了它:data1=open('C:/deploy/qatrackplus/python/imgs/test1.png','rb')。read(),我仍然收到同样的500个错误,我想这不是一个简单的解决方案。有时间我会继续找的。你能试着把data1的前几个字符打印到你的控制台上,看看它是否像你期望的那样是字符串数据吗?我不确定.png应该是什么样子,但在尝试查看字符串数据时,它给出了一系列随机字符,使我的终端没有响应。这就是为什么我说只使用前几个字符(比如data1)[:5]或其他)。我只是想验证您是否确实从文件中获取了数据。随机字符是您希望看到的,这就是二进制数据作为字符串的外观。我的下一个问题是,file upload参数是否需要文件路径,或实际的二进制数据?从我可以看出,它需要文件名(我假设它必须在同一个目录中)或文件的路径。在请求的实际代码中,它说:param files:(可选)Dictionary of
'filename':file-like-objects
,用于多部分编码上载。我将其更改为:data1=open('C:/deploy/qa