使用django和芹菜异步提供图像?

时间:2017-12-13 11:16:48

标签: django image celery django-celery

我有一个django应用程序,可在加载某个页面时提供图像。图像存储在S3上,我使用boto检索它们,并将图像内容作为具有适当内容类型的HttpResponse发送。

这里的问题是,这是一个阻止调用。有时,需要很长时间(几百KB的图像几秒)来检索图像并将它们提供给客户端。

我尝试将此过程转换为芹菜任务(异步,非阻塞),但我不确定如何在下载完成后发回数据(图像)。从芹菜任务返回HttpResponse不起作用。我在旧的芹菜文档here中找到了与http回调任务相关的文档,但在较新的celery版本中不支持此功能。

那么,我应该在js中使用轮询吗? (我在我网站的其他部分使用过celery任务,但所有这些都是基于套接字的)或者这是解决问题的正确方法吗?

代码:

Django查看获取图像的代码(使用boto3从S3获取):(在views.py中)

@csrf_protect
@ensure_csrf_cookie
def getimg(request, public_hash):
    if request.user.is_authenticated:
        query = img_table.objects.filter(public_hash=public_hash)
    else:
        query = img_table.objects.filter(public_hash=public_hash, is_public=True)
    if query.exists():
        item_dir = construct_s3_path(s3_map_thumbnail_folder, public_map_hash)
        if check(s3, s3_bucket, item_dir): #checks if file exists
            item = s3.Object(s3_bucket, item_dir)
            item_content = item.get()['Body'].read()
            return HttpResponse(item_content, content_type="image/png",status=200)
        else: #if no image found, return a blank image
            blank = Image.new('RGB', (1000,1000), (255,255,255))
            response = HttpResponse(content_type="image/jpeg")
            blank.save(response, "JPEG")
            return response
    else: #if request image corresponding to hash is not found in db
        return render(request, 'core/404.html')

我在这样的页面中调用上面的django视图: <img src='/api/getimg/123abc' alt='img'>

urls.py我有:
url(r'^api/getimg/(?P<public_hash>[a-zA-Z0-9]{6})$', views.getimg, name='getimg')

0 个答案:

没有答案