我有一个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。
答案 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/