爲什麼不使用redis來緩存和代理您的圖像? 我寫了一個web應用程序,需要從API服務器請求圖像,但有時可能會被禁止403,所以我從API服務器獲取圖像並緩存它們。
的區別是:
- 前:客戶< - > 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')
注意,上面的例子將獲得的圖像,只有當有人訪問它高速緩存,所以可以在第一時間花費一些時間。您可以先自己提取圖像。在我的情況(我使用上面的方式),我很好。
最初的想法是從puppy-eyes。閱讀源代碼以獲取更多詳細信息。
哪部分速度慢? 'requests.get'或'return Response'? – nathancahill
您可以嘗試在'iter_content(chunk_size)'中使用不同的尺寸播放。默認大小是'1',這將會非常慢。改爲使用'1024'或'2048'。 – nathancahill
我將chunk_size更改爲2048 - 好多了!謝謝!想發佈這個答案,我可以標記它嗎? – Shoham