2017-07-13 65 views
7

Mam aplikację Django, która używa django-wkhtmltopdf do generowania plików PDF na Heroku. Niektóre odpowiedzi przekraczają 30-sekundowy limit czasu. Ponieważ jest to proof-of-concept działający na wolnym poziomie, wolałbym nie rozrywać tego, co muszę przenieść do procesu pracownika/ankiety. Mój obecny widok wygląda następująco:Faking Streaming Response w Django, aby uniknąć Heroku Timeout

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

Czy istnieje sposób mogę zastąpić metodę klasy widoku dispatch do fałszywej odpowiedzi streamingu like this lub z Empy wyrwy approach mentioned here wysłać pustą odpowiedź aż PDF jest renderowany ? Wysyłanie numeru empty byte will restart the timeout process dającego dużo czasu na wysłanie pliku PDF.

+0

Jak udaje odpowiedź rozwiązać problem limit czasu? –

+0

@DanielRoseman dobre pytanie, zaktualizowane, aby wyjaśnić. – Tom

+0

Czy możesz użyć kanałów, aby obejść ten problem? –

Odpowiedz

3

Rozwiązałem podobny problem używając Selera, coś w tym stylu.

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

Następnie można mieć drugi widok, który może sprawdzić stan zadania.

from celery.result import AsyncResult 

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

Wreszcie za pomocą javascript można po prostu pobrać status tuż po uruchomieniu zadania. Aktualizowanie co pół sekundy będzie więcej niż wystarczające, aby zapewnić użytkownikom dobrą opinię.

Jeśli uważasz, że seler jest dużo, są lekkie alternatywy, które będą pracować po prostu super: https://djangopackages.org/grids/g/workers-queues-tasks/

+1

:) To jest właśnie podejście, którego staram się unikać, jeśli mogę, bo nie mamy już budżetu. Pójdę z pracownikiem/ankietą, jeśli będzie to potrzebne. Dzięki. – Tom