响应流[200 OK]>不是JSON可序列化的流图像python

时间:2016-09-28 12:01:44

标签: python json python-2.7 bing-maps bing

我正在寻找一种方法来从bing地图提供一些图像而不共享URL(因为它包含密钥)并将其返回给客户端(不先保存到磁盘)。我在here

中使用此方法
def get_stream_from_url(url):
    req = requests.get(url, stream = True)
    return Response(stream_with_context(req.iter_content()), content_type = req.headers['content-type'])

我在另一种方法中使用它,在那里我生成一个包含那些图像的信息的列表,所以基本上我想将sream响应放在json中作为键url的值:

   def images_data_and_url(self, data):
        results = []
        for i in range(1, 13):
            image = {}
            description = data['description']
            url = self.get_stream_from_url(data['url'])
            tile = {"description": description
                    "url": url}
           results.append(image)
        print results
        return json.dumps(results)

编辑: 如果我打印结果我有这个:

<type 'list'>: [{'description': ' this is an example', 'url': <Response streamed [200 OK]>}, {'description': ' this is an example', 'url': <Response streamed [200 OK]>} , {'description': ' this is an example', 'url': <Response streamed [200 OK]>}, {'description': ' this is an example', 'url': <Response streamed [200 OK]>}, {'description': ' this is an example', 'url': <Response streamed [200 OK]>}, {'description': ' this is an example', 'url': <Response streamed [200 OK]>}, {'description': ' this is an example', 'url': <Response streamed [200 OK]>}, {'description': ' this is an example', 'url': <Response streamed [200 OK]>},{'description': ' this is an example', 'url': <Response streamed [200 OK]>}, {'description': ' this is an example', 'url': <Response streamed [200 OK]>}, {'description': ' this is an example', 'url': <Response streamed [200 OK]>}, {'description': ' this is an example', 'url': <Response streamed [200 OK]>}]

如果我这样做,我会收到此错误

<Response streamed [200 OK]> is not JSON serializable

这是因为函数get_stream_from_url返回一个响应:/我的问题是我不知道如何以另一种方式发送它?

在HTML中,我获取数据并为每个图像分配数据,如下所示:

<img class="image1 " data-description="The description" src="">

有人可以帮助我,如何对流进行编码,以便我可以像使用JSON数据一样发送它?

2 个答案:

答案 0 :(得分:1)

Flask对此有点矫枉过正。我创建了一个名为wsinfo的库,可在此处找到:https://github.com/linusg/wsinfo

有了它,代码就像:

import base64
import wsinfo
import sys


def html_image(data, content_type):
    if sys.version.startswith("3"):
        from io import BytesIO
        f = BytesIO(data.encode())
    else:
        from StringIO import StringIO
        f = StringIO(data)

    encoded = base64.b64encode(f.read())
    return "data:{};base64,{}".format(content_type, encoded)

url = "http://t0.tiles.virtualearth.net/tiles/a1210223003.jpeg?g=854&mkt=en-US"
w = wsinfo.Info(url)
img = html_image(w.content, w.content_type)

with open("out.html", "w") as html:
    html.write('<img class="image1" data-description="The description" src="{}" />'.format(img))

代码同时运行Python 2和3,并生成一个名为out.html的HTML文件,其中嵌入了图像。

答案 1 :(得分:0)

无需隐藏Bing地图密钥。任何人都可以根据免费使用条款创建并使用它。因此,他们没有动力窃取你的钥匙。在密钥似乎被盗的大多数情况下,根本原因是代码被移交,其中包含在论坛帖子中的代码示例中发布的密钥或密钥。密钥的用户通常不知道代码中的密钥。 Bing Maps团队能够跟踪这些情况并根据需要解决这些问题。这说很少发生。通常,当有人想要窃取Bing地图密钥时,他们只需使用Bing Maps网站上的密钥。