[英]Python Flask - image proxy
我正在寻找一种从网络获取图像并将其返回给客户端的方法(无需先保存到磁盘)。 像这样(从此处获取 ):
import requests
from flask import Response, stream_with_context
@files_blueprint.route('/', methods=['GET'])
def get_image():
req = requests.get('http://www.example.com/image1.png', stream = True)
return Response(stream_with_context(req.iter_content()), content_type = req.headers['content-type'])
上面的代码正在工作,但速度确实很慢。
还有更好的方法吗?
为什么不使用Redis缓存和代理图像? 我编写了一个Web应用程序,需要从API服务器请求图像,但有时可能会禁止403,因此我从API服务器获取图像并将其缓存。
之前:客户端-> API服务器:可能会得到403
现在带有图像代理:
未缓存:
缓存:
区别在于:
在客户端直接从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')
请注意,上面的示例将仅在有人访问时获取并缓存该图像,因此可能会在第一时间花费一些时间。 您可以先自己获取图像。 就我而言(我使用上面的方法),我很好。
最初的想法来自小狗的眼睛 。 阅读源代码以获取更多详细信息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.