2017-07-13 30 views
7

我有一个Django应用程序,它使用django-wkhtmltopdf在Heroku上生成PDF。其中一些响应超过了30秒的超时时间。因为这是一个在免费层上运行的概念验证,所以我不想把我必须转移到工人/投票进程的东西分开。我现在的看法是这样的:在Django中伪造流媒体响应以避免Heroku超时

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

有直至PDF渲染的方式我可以重写视图类的dispatch方法伪造流响应like this或与Empy分块approach mentioned here发送一个空响应?发送empty byte will restart the timeout process给予足够的时间发送PDF。

+0

如何将伪造的响应解决超时问题? –

+0

@DanielRoseman好问题,更新解释。 – Tom

+0

您可以使用渠道来制定解决方法吗? –

回答

3

我用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/

+1

:)这实际上是我试图避免的方法,如果我可以只是因为我们的预算不足。如果需要的话,我会和工人/投票人一起去。谢谢。 – Tom