Django通过ajax

时间:2015-12-26 18:58:31

标签: javascript python ajax django

我正在尝试为我的views.py创建一个ajax请求,该请求返回一个较大图像的裁剪段。我遇到的问题是图像似乎没有下载,或者至少没有被绘制。没有与之关联的错误消息,只是没有任何反应(包括"测试"没有记录到控制台)。我已经在javascript中留下了一些尝试,但它们似乎都没有用。

对于被调用的',查看功能似乎也不是特别快。请求后5秒以上打印响应。我想知道这是否是因为加载图像需要很长时间?如果是这种情况,有办法加快速度,即只加载一次图像并将其保存在内存中或只是更好的方式。这是一个非常大的图像(12000x6000px,28.5 MB JPEG)。 我知道通过使用日志记录模块确认了它来调用views.py函数。

简而言之:

  1. 为什么我的图像没有显示?
  2. 是否有更快捷的方式传递图像?
  3. Views.py:

    def test(request):
        img = Image.open(settings.STATIC_PATH + 'geogame/big_map.jpg')
        img.load()
        xpos = int(request.GET.get('xpos', ''))
        ypos = int(request.GET.get('ypos', ''))
        upper = ypos*10 - 300
        left = xpos*10 - 600
        right = xpos*10 + 600
        lower = ypos*10 + 300
        cropped_img = img.crop((left, upper, right, lower))
        logging.warn('called')
    
        response = HttpResponse(content_type = 'image/jpg')
        img.save(response, "JPEG")
        return response
    

    Ajax请求:

    Game.zoom = function() {
        zoomx = Game.clickX
        zoomy = Game.clickY
        $.ajax({
            url: 'zoom/',
            data: {xpos: zoomx, ypos: zoomy},
            type: 'get',
            success: function(data) {
                //Game.zoomedImg.src = "data:image/jpg;base64,"+data
                //Game.zoomedImg.src = data;
                //console.log(Game.zoomedImg.src);
                Game.zoomedImg.onload = function() {
                    console.log("load");
                    Game.zoomedImg.src = "data:image/jpg;base64,"+data
                }
                //$("#" + this.zoomedImg).one("load", function() {
                //    console.log("test");
                //    Game.ctx.drawImage(Game.zoomedImg, 0, 0);
                //    }).attr("src", "data:image/jpg;base64,"+data);
                //Game.ctx.drawImage(Game.zoomedImg, 0, 0);
                console.log("hello");
                //};
            },
            failure: function(data) {
                console.log('failed to load zoomed image')
            }
        });
    }
    

    谢谢!

    修改

    buffer = cStringIO.StringIO()     logging.warn('egege')
    cropped_img.save(buffer, format = "JPEG")
    logging.warn('ffgge')
    img_str = base64.urlsafe_b64encode(buffer.getvalue())
    logging.warn('leflefe')
    return HttpResponse(img_str)
    

1 个答案:

答案 0 :(得分:0)

我相信我已经解决了两个部分

需要将图像加载到字符串缓冲区中并在加载后进行base64编码以便下载:

buffer = cStringIO.StringIO()
cropped_img.save(buffer, format = "JPEG")
img_str = base64.b64encode(buffer.getvalue())
return HttpResponse(img_str)

这似乎是因为作物动作很懒,需要在它生效之前保存。

另外,为了加快图像加载操作的过程并使其单个出现,可以将以下两行移动到该函数的views.py文件OUTSIDE的开头。

img = Image.open(settings.STATIC_PATH + 'geogame/big_map.jpg')
img.load()