2015-05-14 18 views
1

我正在尋找一種方法從網上獲取圖像並將其返回給客戶端(不先保存到磁盤)。類似的東西(從here拍攝):Python瓶 - 圖像代理

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']) 

上面的代碼工作,但它真的很慢。
有什麼更好的辦法?

+0

哪部分速度慢? 'requests.get'或'return Response'? – nathancahill

+3

您可以嘗試在'iter_content(chunk_size)'中使用不同的尺寸播放。默認大小是'1',這將會非常慢。改爲使用'1024'或'2048'。 – nathancahill

+0

我將chunk_size更改爲2048 - 好多了!謝謝!想發佈這個答案,我可以標記它嗎? – Shoham

回答

2

爲什麼不使用redis來緩存和代理您的圖像? 我寫了一個web應用程序,需要從API服務器請求圖像,但有時可能會被禁止403,所以我從API服務器獲取圖像並緩存它們。

  • 前: 客戶端 - > API服務器:可以得到403

  • 現在與圖片代理:

    • 不會被緩存:

      • 客戶端 - >我的服務器:找不到
      • 我的服務器 - > API s erver:獲得圖像,它緩存,發送到客戶端
    • 緩存:

      • 客戶端 - >我的服務器:找到它,並從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') 

注意,上面的例子將獲得的圖像,只有當有人訪問它高速緩存,所以可以在第一時間花費一些時間。您可以先自己提取圖像。在我的情況(我使用上面的方式),我很好。

最初的想法是從puppy-eyes。閱讀源代碼以獲取更多詳細信息。

+0

感謝您的回答!雖然這很好,但它爲我的任務複雜化。 (我沒有太多的圖像,不需要緩存) – Shoham