2016-05-13 13 views
0

Ich benutze WeasyPrint, um ein PDF zu erstellen. Die PDFs können leicht über 120 Seiten erreichen und bis zu 2 Minuten dauern. Während dies geschieht, sieht die Seite eingefroren aus und reagiert nicht. Ich suche in Sellerie, aber bis ich es bekommen würde Ich mag einen Fortschrittsbalken implementieren:Fortschrittsbalken für Django WeasyPrint PDF Export anzeigen

perfekte Lösung: Irgendwie den aktuellen Status der PDF-Export packen und zeigen es in einem Fortschrittsbalken

Acceptable Solution: Zeigen Sie eine bewegende Fortschrittsanzeige an, die dem Benutzer mitteilt, dass es bis zu zwei Minuten dauern kann, bis die PDF-Datei im Browser angezeigt/heruntergeladen wird.

Irgendwelche Ideen? Vielen Dank!

aktuellen 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 

Antwort

0

genaue Fortschritte zu erhalten, würden Sie Back-End getroffen haben immer wieder irgend url einen Ajax-Aufruf verwenden. Die mit der URL verbundene Ansicht ist natürlich nicht mit den Hauptansichten verbunden, die für die Konvertierung verantwortlich sind. Daher müssten Sie den Fortschritt in der Datenbank speichern. (für einen 2 min Job scheint mir das sinnlos).

Darüber hinaus würde das Extrahieren des aktuellen Fortschritts aus dem Prozess und das Speichern in der Datenbank ein weiteres Problem darstellen.

Da Sie sicher sind, dass es maximal ein 2 oder 3 min Job ist, machen Sie einen JavaScript-Lader im Frontend-Skript, während in einem festen Intervall (vielleicht 20 Sekunden) das Backend zu sehen, ob die Datei erstellt wurde nicht. Wenn es umgeleitet wurde, um die PDF-Datei anzuzeigen (oder was immer Sie wollen), behalten Sie das fortlaufende Ladezeichen bei (das in 3 Minuten abgeschlossen sein kann).

(Alles, was ich bin zu erklären geschieht auf der gleichen Seite mit Ajax, sonst würden Sie Python Asynchron-Methoden verwenden müssen)

Wenn der Benutzer für pdf einreicht fordern, rufen Sie die Ansicht (über Ajax) zu erstellen pdf und starten Sie das Loader-Ding wie zuvor erwähnt.

Sie können dies erweitern, um Pythons Threading zu verwenden, und benötigen keinen Sellerie, es sei denn, Sie möchten diese Aufgabe überwachen.

+0

Vielen Dank für Ihre Antwort! Kannst du mich auf Ressourcen hinweisen, in denen "das Backend" beschrieben wird? Ich habe derzeit keine Ahnung, wie ich das machen würde. – kftb

+0

Tut mir leid, indem ich das Backend treffe, ich meine Ajax Anrufe zu einer URL machen. Dafür gibt es zahlreiche Beispiele (Django mit Ajax). – RA123