在requests.post()
方法中同时使用json
和files
属性可以吗?我之所以这么问,是因为我收到了500个错误,而服务器没有特定的错误输出。
data = {
'first_name': self.ids['first_name'].text,
'middle_name': self.ids['middle_name'].text,
'last_name': self.ids['last_name'].text,
'new_comment': self.ids['comment'].text
}
files = {'image_file1': open(self.file_path1, 'rb')}
headers = {'enctype': 'multipart/form-data', 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.90 Safari/537.36'}
response = requests.post('http://localhost/users/add', json=data, files=files, headers=headers)
我从后端的以下变量中得到None
:
post_data = request.get_json()
image_file1 = request.files.get('image_file1')
更新代码:
前端:
data = {
'first_name': self.ids['first_name'].text,
'middle_name': self.ids['middle_name'].text,
'last_name': self.ids['last_name'].text,
'new_comment': self.ids['comment'].text
}
files = {'image_file1': open(self.file_path1, 'rb'), 'data': json.dumps(data)}
headers = {...}
response = requests.post('http://localhost/users/add', files=files, headers=headers)
烧瓶后端:
post_data = json.loads(request.files['data'])
print(post_data)
image_file1 = request.files.get('image_file1')
烧瓶投掷TypeError: the JSON object must be str, bytes or bytearray, not FileStorage
这就是如何实现您想要的:
files = {'image_file1': open(self.file_path1, 'rb')}
data = {
'first_name': self.ids['first_name'].text,
'middle_name': self.ids['middle_name'].text,
'last_name': self.ids['last_name'].text,
'new_comment': self.ids['comment'].text
}
r = requests.post(url, files=files, data=data)
请求将发送一个multi-part
表单POST主体,其中image_file1
字段设置为file_path1
文件的内容。
不能同时拥有文件和数据,因此需要将其中一个放在另一个里面。
将二进制文件放在JSON中效率低且容易出错。
所以你可以把数据放在这样的文件里:
requests.post(
'...',
files={
'f': open('...'),
'data': json.dumps({...}) # move data here
},
headers={...}
)
在服务器端,尽管你需要修改你的代码,但在烧瓶中,这将是
- request.json
+ json.load(request.files['data'])