我有一个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应用程序的一个脚本中存在属性错误。如果我为没有需要填充的文件上传的表单运行脚本,我不会得到这个。
答案 0 :(得分:0)
我认为您的问题来自于您将data1
和data2
传递给表单的方式。您在图像文件上调用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)
根据需要上传文件。谢谢你的帮助!