json和requests模块的files属性



requests.post()方法中同时使用jsonfiles属性可以吗?我之所以这么问,是因为我收到了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'])

最新更新