在Django中伪造流式响应以避免Heroku超时

时间:2017-07-13 14:07:18

标签: django pdf heroku

我有一个Django应用程序使用django-wkhtmltopdf在Heroku上生成PDF。一些响应超过了30秒的超时。因为这是在免费套餐上运行的概念验证,所以我不想拆分我必须转移到工人/民意调查过程。我目前的观点如下:

def dispatch(self, request, *args, **kwargs):
    do_custom_stuff()
    return super(MyViewClass, self).dispatch(request, *args, **kwargs)

有没有办法可以覆盖视图类的dispatch方法来伪造流响应like this或使用Empy Chunking approach mentioned here发送空响应,直到PDF为渲染?发送empty byte will restart the timeout process会有足够的时间发送PDF。

1 个答案:

答案 0 :(得分:4)

我使用Celery解决了类似的问题,就像这样。

def start_long_process_view(request, pk):
    task = do_long_processing_stuff.delay()
    return HttpResponse(f'{"task":"{task.id}"}')

然后你可以有第二个可以检查任务状态的视图。

from celery.result import AsyncResult

def check_long_process(request, task_id):
    result = AsyncResult(task_id)
    return HttpResponse(f'{"state":"{result.state}"')

最后使用javascript,您可以在任务启动后立即获取状态。每半秒更新一次将足以为您的用户提供良好的反馈。

如果您认为芹菜很重要,那么有一些很好的选择可以很好地发挥作用:https://djangopackages.org/grids/g/workers-queues-tasks/