提问者:小点点

使用Python将多部分/表单数据上传到WordPress REST API


我有一个正在构建的API,它将允许我使用他们的新API将媒体上传到我的WordPress网站。我已经在互联网和SO上搜索了这个问题的解决方案,但所有答案似乎都使用较旧的WordPress API,所以我在寻找答案方面没有取得多大成功。

我在函数中编写了以下代码,用于向 API 发送多部分/表单数据请求:

img = open(image_path, 'rb')
file_name = os.path.basename(image)

print('Compressing and sending data...')

NEW_HEADER = {
    'Authorization': f'BEARER {WORDPRESS_ACCESS_TOKEN}',
    'Content-Disposition': f'attachment; filename={file_name}',
    'Content-Type': 'multipart/form-data'
}

response = requests.post(
    url=WORDPRESS_MEDIA_URL,
    files={'media': img.read()},
    headers=NEW_HEADER
)

print(response.request)
print(response.text)
return response

这让我返回:

{"media":[],"errors":[]}
<Response [200]>
OK

所以,它向endpoint发送一些东西,但是它返回一个空数组和空错误框。再说一次,我似乎找不到新WP的任何解决方案,所以原谅我,如果Python看起来有点粗糙和拼凑,我只是把看起来有用的东西放在一起。

自原始发布以来的进一步阅读

我用Postman ping了API,它按预期返回数据:

{"media":[{"id":"xxxx","date":"2022-11-03T20:06:54-05:00","parent":0,"link":"https:mywebsite","title":"mypicture","caption":"","description":"",...}

因此,由于post请求似乎不是问题,我尝试在Postman和本地控制台中调试我的请求以查看正在发送的内容:

{'User-Agent': 'python-requests/2.28.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'BEARER QnkXS43KhiqO7Oa!9G!zN2gnz90hHhZEribF2ddZu0h8&5V0p5M69^OwDb9E6H%B', 'Content-Type': 'multipart/form-data', 'Content-Length': '6'}
media=

我看到< code>media从我的本地控制台返回空值。在Postman中,< code>media作为< code>undefined返回(虽然我不确定这是否只是Postman无法在控制台/调试器中解析JSON格式的图像。

这让我相信,要么我使用图像访问/调用目录的方式是错误的,要么我尝试将其编码为请求的方式是错误的。

甚至进一步阅读,因为张贴

从那以后,我通过将照片从外部目录复制到项目文件夹内的目录,绕过了对目录问题的任何担忧。

从那以后,我发送数据的当前方式似乎返回了相同的响应,就好像我根本没有发送任何东西一样:

response = requests.post(
    url=WORDPRESS_MEDIA_URL, # there is no data sent in this request.
    headers=NEW_HEADER
)

这仍然返回我:

{"media":[],"errors":[]}
<Response [200]>
OK

因此,做一些进一步的阅读和研究,我遇到了请求工具带,它可以帮助发送多部分/表单数据

data = MultipartEncoder(fields={'media': (file_name, img, 'image/jpeg')})

new_header = {
    'Authorization': f'BEARER {WORDPRESS_ACCESS_TOKEN}',
    'Content-Type': data.content_type,
    'Content-Disposition': 'form-data; name="media"; filename="%s"' % name_img,
}

response = requests.post(WORDPRESS_MEDIA_URL, data=data, headers=new_header)

现在,当我用这些数据发送一个请求时,我得到这样的响应:

{"error":"unsupported_mime_type","message":"File type unknown"}
<Response [400]>
Bad Request

因此,使用 MultipartEncoder 发送请求会返回不受支持的 MIME 类型的错误。因此,虽然这不是一个空白的 200 响应,但它让我有理由认为,也许我错误地使用了 MultipartEncoder,或者我没有对我尝试上传的图片进行适当的调整。

对此有任何见解都将不胜感激。


共1个答案

匿名用户

我想通了:

payload = {}
files = [('media', ('image-name', img, 'application/octet-stream'))]

new_header = {'Authorization': f'BEARER {WORDPRESS_ACCESS_TOKEN}',}

response = requests.post(WORDPRESS_MEDIA_URL, data=payload, files=files, headers=new_header)

我从这篇SO帖子中学到了如何获取Python请求等效于我将发送的测试请求,它制作了一个与我现在拥有的非常相似的代码片段。