我有一个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')