Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将PIL.Image发送到django服务器端并取回_Python_Django_Python 3.x_Python Imaging Library - Fatal编程技术网

Python 将PIL.Image发送到django服务器端并取回

Python 将PIL.Image发送到django服务器端并取回,python,django,python-3.x,python-imaging-library,Python,Django,Python 3.x,Python Imaging Library,我不知道将映像从客户端发送到服务器端的背后是什么,所以我被下面的场景卡住了 我想使用将PIL.Image对象发送到django服务器端,然后将其取回,以便使用服务器端的PIL.Image对象。 正如我已经测试过的,如果在没有任何转换的情况下发送PIL.Image对象,即 r = requests.post(SERVER_URL, data={ 'image': PILimage,#PILimage is of type PI

我不知道将映像从客户端发送到服务器端的背后是什么,所以我被下面的场景卡住了

我想使用将
PIL.Image
对象发送到django服务器端,然后将其取回,以便使用服务器端的
PIL.Image
对象。 正如我已经测试过的,如果在没有任何转换的情况下发送
PIL.Image
对象,即

r = requests.post(SERVER_URL,
                data={
                    'image': PILimage,#PILimage is of type PIL.Image
                    'wordPos':(86,23)
                    },
                )
r = requests.post(SERVER_URL,
                data={
                    'image': PILimage.tobytes(),#PILimage is of type PIL.Image
                    'wordPos':(86,23)
                    },
                )
然后我在服务器端得到了一个值为
str
对象,我猜这是由
请求引起的,它在发送之前将
PIL.Image
对象转换为
str
对象,所以为什么
请求
进行转换?为什么我们不能在没有任何转换的情况下通过互联网发送
PIL.Image
对象?请在这里解释一下,谢谢

有人告诉我,我可以将
PIL.Image
对象转换为
字节
形式,然后进行发送,也就是说

r = requests.post(SERVER_URL,
                data={
                    'image': PILimage,#PILimage is of type PIL.Image
                    'wordPos':(86,23)
                    },
                )
r = requests.post(SERVER_URL,
                data={
                    'image': PILimage.tobytes(),#PILimage is of type PIL.Image
                    'wordPos':(86,23)
                    },
                )

但是如何将图像返回到服务器端的
PIL.image
对象?
似乎没有帮助。

任何经过连接的东西都必须是一个字节序列,以及解释这些字节的方法(如果协议没有强制执行某些特定含义)。用HTTP的说法,这意味着您必须添加一个内容类型头,声明对发送的字节的解释

你可以:

>>> import io
>>> file_like_object = io.BytesIO()
>>> PILImage.save(file_like_object, format='png')
然后,您的POST请求应该有一个标题
内容类型:image/png
,并将
file\u like\u object.getvalue()
作为请求主体发送。

用于发送图像

def myOCR(PILimage, wordPos):
  image = io.BytesIO()
  PILimage.save(image, 'png')  # 没有什么类型,这里就任意指定个吧;For images created by the library itself (via a factory function, or by running a method on an existing image), this attribute is set to None.
  image.seek(0)  # 要回到开始才行,不然后面requests读的时候会从结尾读,读不到数据

  r = requests.post(SERVER_URL,
      files={'image': image},
      data={'wordPos': wordPos}
  )

  result = r.json()
  return result['word']

在Django端,可以使用
image.open(request.FILES['image'])获取图像。

为什么“任何经过电线的东西都必须是字节序列”?我想进一步解释一下,我对计算机网络了解不多。这是一个非常基本的问题,我不能在这里详细阐述。我建议你从起点开始,继续读下去……谢谢,我终于解决了