请求模块的json和文件属性

2024-06-07 17:38:06 发布

您现在位置:Python中文网/ 问答频道 /正文

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


Tags: textnameimageselfjsonidsmiddledata
2条回答

这就是如何实现您的目标:

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={...}
)

在服务器端,虽然您需要修改代码,但在flask中

- request.json
+ json.load(request.files['data'])

相关问题 更多 >

    热门问题