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