2017-07-13 3 views
7

私はHerokuでPDFを生成するためにdjango-wkhtmltopdfを使用するDjangoアプリを持っています。応答の一部は30秒のタイムアウトを超えています。これはフリー・ティアで実行される概念実証であるため、私はワーカー/ポーリング・プロセスに移す必要があるものを裂かないことを望んでいます。私の現在のビューは次のようになります。ヘロクタイムアウトを避けるためにDjangoでストリーミングレスポンスを偽る

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

は、私はPDFが表示されるまで、空の応答を送信するために偽のストリーミング応答like thisまたはEmpyチャンキングapproach mentioned hereでビュークラスのdispatchメソッドをオーバーライドすることができます方法はあります? empty byte will restart the timeout processを送信すると、PDFを送信するのに十分な時間が与えられます。

+0

はどのようにタイムアウトの問題を解決するための応答を偽造でしょうか? –

+0

@DanielRoseman良い質問、説明が更新されました。 – Tom

+0

回避策を立てるためにチャネルを使用できますか? –

答えて

3

私はセロリを使って同様の問題を解決しました。

def start_long_process_view(request, pk): 
    task = do_long_processing_stuff.delay() 
    return HttpResponse(f'{"task":"{task.id}"}') 

次に、タスクの状態を確認できる2つ目のビューを作成できます。

from celery.result import AsyncResult 

def check_long_process(request, task_id): 
    result = AsyncResult(task_id) 
    return HttpResponse(f'{"state":"{result.state}"') 

最後に、javascriptを使用すると、タスクの開始直後にステータスを取得できます。ユーザーに良いフィードバックを与えるには、0.5秒ごとに更新するだけで十分です。

あなたはセロリがはるかにあると考えられる場合は、単に素晴らしい仕事だろう光の選択肢がありますhttps://djangopackages.org/grids/g/workers-queues-tasks/

+1

:)それは実際に私が予算外であることができれば私が避けようとしているアプローチです。私は労働者/ポーリングと一緒に行く必要がある場合。ありがとう。 – Tom

関連する問題