2017-07-13 33 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