Python-image代理

Python-image代理,python,flask,python-requests,Python,Flask,Python Requests,我正在寻找一种从web获取图像并将其返回到客户端的方法(无需先保存到磁盘)。类似的东西(摘自): 上述代码正在运行,但速度非常慢。 有更好的方法吗?为什么不使用redis来缓存和代理您的图像? 我编写了一个web应用程序,需要从API服务器请求图像,但有时可能会被403禁止,因此我从API服务器获取图像并缓存它们 之前: 客户端->API服务器:可能会得到403 现在使用图像代理: 未缓存: 客户端->我的服务器:找不到 我的服务器->API服务器:获取图像,缓存它,发送到客户端 缓存:

我正在寻找一种从web获取图像并将其返回到客户端的方法(无需先保存到磁盘)。类似的东西(摘自):

上述代码正在运行,但速度非常慢。

有更好的方法吗?

为什么不使用redis来缓存和代理您的图像? 我编写了一个web应用程序,需要从API服务器请求图像,但有时可能会被403禁止,因此我从API服务器获取图像并缓存它们

  • 之前: 客户端->API服务器:可能会得到403

  • 现在使用图像代理:

    • 未缓存:

      • 客户端->我的服务器:找不到
      • 我的服务器->API服务器:获取图像,缓存它,发送到客户端
    • 缓存:

      • 客户端->我的服务器:找到它,从redis获取图像并发送回
区别在于:

  • 之前:客户端API服务器
  • 现在:客户端我的服务器API服务器
在客户端直接从API服务器获取图像之前,可能会出现问题。现在,所有图像都指向我的服务器,这样我可以做更多的事情

您还可以控制过期时间。有了强大的redis,你应该很轻松

我会给你一个基本的例子来帮助你理解它

from StringIO import StringIO

from flask import send_file, Flask
import requests
import redis

app = Flask(__name__)
redis_server = redis.StrictRedis(host='localhost', port=6379)

@app.route('/img/<server>/<hash_string>')
def image(server, hash_string):
    """Handle image, use redis to cache image."""
    image_url = 'http://www.example.com/blabla.jpg'
    cached = redis_server.get(image_url)
    if cached:
        buffer_image = StringIO(cached)
        buffer_image.seek(0)
    else:
        r = requests.get(image_url)  # you can add UA, referrer, here is an example.
        buffer_image = StringIO(r.content)
        buffer_image.seek(0)
        redis_server.setex(image_url, (60*60*24*7),
                           buffer_image.getvalue())
    return send_file(buffer_image, mimetype='image/jpeg')
从StringIO导入StringIO
从烧瓶导入发送_文件,烧瓶
导入请求
导入redis
app=烧瓶(名称)
redis_server=redis.StrictRedis(host='localhost',port=6379)
@应用程序路径(“/img/”)
def映像(服务器,哈希_字符串):
“”“处理图像,使用redis缓存图像。”“”
图片http://www.example.com/blabla.jpg'
cached=redis\u server.get(image\u url)
如果缓存:
buffer_image=StringIO(缓存)
缓冲区\u图像搜索(0)
其他:
r=requests.get(image_url)#您可以添加UA、referer,下面是一个示例。
buffer_image=StringIO(r.content)
缓冲区\u图像搜索(0)
redis_server.setex(图像url,(60*60*24*7),
缓冲区\u image.getvalue())
返回发送文件(缓冲区图像,mimetype='image/jpeg')
请注意,上面的示例仅在有人访问图像时才会获取图像并将其缓存,因此在第一次访问时可能会花费一些时间。你可以先自己取图像。在我的情况下(我使用上面的方法),我可以接受


最初的想法来自。阅读源代码了解更多详细信息。

哪个部分速度较慢?
请求.get
返回响应
?您可以尝试在
iter\u内容(chunk\u size)
中使用不同的大小。默认大小为
1
,这将非常慢。试试
1024
或者
2048
吧。我把chunk\u大小改成了2048-好多了!谢谢想把它贴出来作为答案吗?谢谢你的回答!虽然这很有效,但对于我的任务来说却很复杂。(我没有太多图像,也不需要cach)
from StringIO import StringIO

from flask import send_file, Flask
import requests
import redis

app = Flask(__name__)
redis_server = redis.StrictRedis(host='localhost', port=6379)

@app.route('/img/<server>/<hash_string>')
def image(server, hash_string):
    """Handle image, use redis to cache image."""
    image_url = 'http://www.example.com/blabla.jpg'
    cached = redis_server.get(image_url)
    if cached:
        buffer_image = StringIO(cached)
        buffer_image.seek(0)
    else:
        r = requests.get(image_url)  # you can add UA, referrer, here is an example.
        buffer_image = StringIO(r.content)
        buffer_image.seek(0)
        redis_server.setex(image_url, (60*60*24*7),
                           buffer_image.getvalue())
    return send_file(buffer_image, mimetype='image/jpeg')