Python请求PUT更新Prestashop中的图像

时间:2017-07-12 12:10:27

标签: python rest python-requests prestashop

我正在尝试从prestashop中的产品更新现有图像。我正在使用Python和请求以及以下代码:

import requests
import io
import mimetypes
from PIL import Image
from StringIO import StringIO

api_key = 'test'

url = "https://.../api/images/products/249/445"

file_name = 't3_6kxvzv.jpg'
fd = io.open(file_name, "rb")
content = fd.read()
fd.close()

def encode_multipart_formdata():
    """Encode files to an http multipart/form-data.
    :param files: a sequence of (type, filename, value)
        elements for data to be uploaded as files.
    :return: headers and body.
    """
    BOUNDARY = '----------ThIs_Is_tHe_bouNdaRY_$'
    CRLF = '\r\n'
    L = []
    L.append('--' + BOUNDARY)
    L.append(
        'Content-Disposition: form-data; \
            name="%s"; filename="%s"' % ("image", file_name))
    L.append('Content-Type: %s' % get_content_type(file_name))
    L.append('')
    L.append(content)
    L.append('--' + BOUNDARY + '--')
    L.append('')
    body = CRLF.join(L)
    headers = {
         'Content-Type': 'multipart/form-data; boundary=%s' % BOUNDARY
    }
    return headers, body

def get_content_type(file_name):
    """Retrieve filename mimetype.
    :param filename: file name.
    :return: mimetype.
    """
    return mimetypes.guess_type(file_name)[0] or 'application/octet- stream'

header, body = encode_multipart_formdata()

r = requests.put(url, data=body, auth=(api_key,""), headers= header)
# also tried data = content

r = requests.get(url, auth=(api_key,""))
i = Image.open(StringIO(r.content))
i.show()

我用

尝试了各种PUT和POST请求
data = content 

但只获得400状态代码。

然后我尝试获取现有图像,效果很好。

api_key具有允许PUT和POST的所有必要设置。

然后我试着阅读prestapyt如何解决这个问题,但是在导入prestapyt之后我无法按照他们的文档将产品图像添加到产品中使用:

prestashop.add("https://...api/images/products/249/445", files[('image',file_name,content)])

产生

KeyError: ('image', 't3_6kxvzv.jpg', '\xff\xd8\xff\xe0\x00\x10JFI...

然后我尝试修改 encode_multipart_formdata get_content_type函数以生成类似的解决方案,但无法通过400状态代码。

我非常希望使用请求并尝试了解如何使用prestapy和交钥匙解决方案更新图片。

感谢您的时间!

我使用的文档: Prestashop http://doc.prestashop.com/display/PS16/Chapter+9+-+Image+management

prestapyt https://github.com/prestapyt/prestapyt

更新:

我能够使用请求和POST通过以下方式将图像添加到产品中:

url_2 = "https:/.../api/images/products/249"
r = requests.post(url_2, data=body, auth=(api_key,""), headers=header)

仍然无法使用PUT更改或更新图像。

1 个答案:

答案 0 :(得分:0)

无法让PUT工作,所以改为使用DELETE和POST

<table class="table table-hover" th:if="${d.hasRecords()}">
    <thead>
        <tr> 
            <th:block th:eacth="h : ${d.header}">
                <th th:colspan="${d.header.length}" th:text="${h}">Header Field</th>
            </th:block>
        </tr>
    </thead>
    <tbody>
        <tr th:each="record : ${d.records}">
            <th:block th:each="field : ${record}">
                <td th:text="${field}">Dataset Field</td>
            </th:block>
        </tr>
    </tbody>
</table>

解决方法工作正常,但仍然不明白为什么必须有这么复杂的方法以及为什么PUT不起作用。