如何使用flask将动态下载的图像提供给浏览器?

时间:2016-08-23 22:51:36

标签: python flask

我正在使用IP摄像头。我可以使用这样的URL从相机中获取静态图像:

http://Username:Password@IP_of_Camera:Port/streaming/channels/1/picture

我想要做的是让python / flask在客户端加载页面时从该URL下载图像,并使用img标记将图像嵌入到页面中。

如果我的模板看起来像这样:

<html>
    <head>
        <title>Test</title>
    </head>
    <body>
        <img src="{{ image }}">
    </body>
</html>

如何用下载的图片替换{{image}}?

我是否会使用urllib / requests将图像下载到flask的静态文件夹中,用{{ url_for('static', filename="temp_image.png") }}替换{{image}},然后在页面加载时从静态文件夹中删除图像?我会在其他地方下载它(静态文件夹除外)吗?或者是否有其他方法可以将图像保存在内存中?

PS。我知道可以直接用该URL替换{{image}},但是会向客户端显示相机的用户名/密码/ IP /端口。

2 个答案:

答案 0 :(得分:6)

我会在烧瓶上添加一个屏蔽路径,直接取出并提供图像。 让我们说domain.com/image/user1/cam1

您的服务器通常会向摄像头发出http请求,一旦收到回复,您可以直接将其作为具有适当mimetype的Response对象提供。

在这种情况下,从相机获取的图像位于RAM中。

@app.route('image/<userID>/<camID>')
def fun(userID,camID):
    #  fetch the picture from appropriate cam
    pic = requests.get('http://'+
        'Username:Password'+ # dynamically replace user id / password/ auth
        '@IP_of_Camera:Port'+ #dynamically replace port / IP
        '/streaming/channels/1/picture')

    # do processing of pic here..

    return Response(pic,mimetype="image/png")

但是,如果需要一遍又一遍地提供此图像,那么您可能想要缓存它。在这种情况下,我会选择更接近你的方法的东西。

如果你想要流式传输相机图像,这是一个完全不同的球赛。

答案 1 :(得分:1)

import requests
url = "http://Username:Password@IP_of_Camera:Port/streaming/channels/1/picture"
response = requests.get(url)
if response.status_code == 200:
    f = open("/your/static/dir/temp.png", 'wb')
    f.write(response.content)
    f.close()

{{ url_for('static' filename="temp.png") }}

不确定为什么你需要删除它,但我想你可以认为这是必需的