2017-07-13 13 views
7

Tôi có ứng dụng Django sử dụng django-wkhtmltopdf để tạo tệp PDF trên Heroku. Một số câu trả lời vượt quá thời gian chờ 30 giây. Bởi vì đây là một bằng chứng-khái niệm chạy trên tầng miễn phí, tôi không muốn xé toạc những gì tôi phải chuyển sang một quy trình công nhân/thăm dò ý kiến. xem hiện tại của tôi trông như thế này:Thực hiện trả lời trực tuyến ở Django để tránh thời gian chờ Heroku

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

Có cách nào tôi có thể ghi đè lên các phương pháp dispatch của lớp nhằm giả một luồng phản ứng like this hoặc qua các nhân empy chunking approach mentioned here để gửi phản hồi trống cho đến khi PDF được trả lại ? Gửi một số empty byte will restart the timeout process dành nhiều thời gian để gửi tệp PDF.

+0

Làm thế nào sẽ giả mạo trả lời giải quyết vấn đề thời gian chờ? –

+0

@DanielRoseman câu hỏi hay, được cập nhật để giải thích. – Tom

+0

Bạn có thể sử dụng các kênh để giải quyết sự cố không? –

Trả lời

3

Tôi đã giải quyết một vấn đề tương tự bằng cách sử dụng Celery, một cái gì đó như thế này.

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

Sau đó, bạn có thể có chế độ xem thứ hai có thể kiểm tra trạng thái tác vụ.

from celery.result import AsyncResult 

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

Cuối cùng sử dụng javascript, bạn chỉ có thể tìm nạp trạng thái ngay sau khi nhiệm vụ được bắt đầu. Cập nhật sau mỗi nửa giây sẽ quá đủ để cung cấp cho người dùng phản hồi tốt.

Nếu bạn nghĩ rằng cần tây là nhiều, có những lựa chọn thay thế ánh sáng sẽ làm việc chỉ tuyệt vời: https://djangopackages.org/grids/g/workers-queues-tasks/

+1

:) Đó thực sự là cách tiếp cận mà tôi đang cố gắng tránh nếu tôi có thể chỉ vì chúng tôi sắp hết ngân sách. Tôi sẽ đi với nhân viên/bỏ phiếu nếu cần thiết. Cảm ơn. – Tom

Các vấn đề liên quan