在Django中设置流式响应以避免Heroku超时

我有一个使用django-wkhtmltopdf在Heroku上生成PDF的Django应用程序。 其中一些响应超过了30秒的超时时间。 因为这是一个在免费层上运行的概念验证,所以我不想把我必须转移到工人/投票进程的东西分开。 我目前的观点如下所示:

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

有没有一种方法可以重写视图类的dispatch方法来伪造一个像这样的流式响应,或者用这里提到的Empy Chunking方法来发送一个空的响应,直到PDF被渲染? 发送空白字节将重新启动超时过程,给予足够的时间发送PDF。


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

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/

链接地址: http://www.djcxy.com/p/96861.html

上一篇: Faking a Streaming Response in Django to Avoid Heroku Timeout

下一篇: UDP punch hole for a web