在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