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

时间:2015-06-12 13:48:07

标签: python-2.7 http python-requests

我有一个python(python 2.7)脚本,它使用请求模块向我在localhost上运行的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应用程序的一个脚本中存在属性错误。如果我为没有需要填充的文件上传的表单运行脚本,我不会得到这个。

2 个答案:

答案 0 :(得分:0)

我认为您的问题来自于您将data1data2传递给表单的方式。您在图像文件上调用open(),但这并不能为您提供任何数据。它为您提供了一个文件阅读器对象。要从中获取数据,您需要使用类似read()的内容来实际从流中获取数据,以便将其传递。

答案 1 :(得分:0)

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

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)

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