2016-05-13 18 views
0

我正在使用WeasyPrint創建PDF。這些PDF可以輕鬆達到120頁以上,並且最多可能需要2分鐘才能呈現。發生這種情況時,該頁面看起來是凍結的並且沒有響應。我期待到芹菜,但直到我到達那裏,我想實現一個進度條:爲Django WeasyPrint顯示進度條PDF導出

完美的解決方案: 不知何故搶PDF導出的當前狀態,並顯示在一個進度條

可接受的解決方案: 顯示一個正在移動的進度條,告訴用戶可能需要兩分鐘時間,直到PDF顯示在瀏覽器的顯示/下載本身中。

任何想法?謝謝!

當前views.py:

def course_view(request): 
    students = Student.objects.filter(student_courseid__course_accid = request.user.userprofile.course_accid) 

    html_template = get_template('student/student_pdf_all.html') 
    rendered_html = html_template.render({'student': students}, request) 
    pdf_file = HTML(string=rendered_html, base_url=request.build_absolute_uri()).write_pdf(stylesheets=[CSS(settings.STATIC_ROOT + '/css/pdf.css')]) 

    http_response = HttpResponse(pdf_file, content_type='application/pdf') 
    filename = str(request.user.userprofile.course_accid) + ".pdf" 

    http_response['Content-Disposition'] = 'filename="{}"'.format(filename) 

    return http_response 

回答

0

爲了得到確切的進展,你將不得不使用一些URL Ajax調用連連命中後端。連接到url的視圖當然不與負責轉換的主視圖相關聯。因此你必須在數據庫中存儲進度。 (對於2分鐘的工作,這對我來說似乎毫無意義)。

最重要的是,從流程中提取當前進度並存儲到數據庫中將是另一個令人頭疼的問題。

由於您確定最多隻需2分鐘或3分鐘的工作量,因此在前端腳本中創建一個JavaScript加載器,而以固定的時間間隔(可能是20秒)點擊後端以查看該文件是否已創建或不。如果已經創建了重定向來顯示pdf(或任何你想要的),否則保持正在進行的加載符號(可能在3分鐘內完成)。

(一切,我正在解釋發生在同一網頁上使用AJAX,否則你將不得不使用Python異步方法)

當用戶提交請求PDF,調用視圖(通過AJAX)創建pdf並啓動前面提到的加載器。

你可以擴展它來使用python的線程,除非你想監視那個任務,否則不需要芹菜。

+0

謝謝你的迴應!你能否指點我一些資源來解釋「擊中後端」?我目前不知道該怎麼做。 – kftb

+0

對不起,通過點擊後端,我的意思是讓ajax調用一個url。你可以找到很多例子(Django with ajax)。 – RA123