2016-06-21 18 views
3

Ich habe eine Web-App mit Django erstellt. Allerdings brauchte ich eine Desktop-App von demselben, also benutzte ich das Webkit von PyQt. Die ganze Sache funktioniert gut, außer für Dateidownloads. In meiner Web-App liefert der Server herunterladbare Dateien an mehreren Stellen. Wenn Sie jedoch auf die Schaltfläche klicken, die den Download in der Desktop-Version der Anwendung auslösen soll, passiert nichts.Konvertieren einer Django-App in eine Desktop-App mit pyqt webkit

import sys 
from PyQt4.QtCore import * 
from PyQt4.QtGui import * 
from PyQt4.QtWebKit import * 
app = QApplication(sys.argv) 
web = QWebView() 
web.load(QUrl("http://localhost:8000/home")) 
#web.page().setForwardUnsupportedContent(True) 
#web.page().unsupportedContent.connect(save_file_callback) 
web.show() 
sys.exit(app.exec_()) 
+0

Dies kann http://stackoverflow.com/questions/9194094/download-file-from-qwebkit-at-pyqt –

Antwort

1
app = QApplication(sys.argv) 
web = QWebView(loadFinished=load_finished) 
web.load(QUrl("http://localhost:8000/home")) 
web.page().setForwardUnsupportedContent(True) 
web.page().unsupportedContent.connect(save_file_callback) 
web.show() 
sys.exit(app.exec_()) 

def save_file_callback(reply): 
    try: 
     with urllib.request.urlopen(reply.url().toString()) as response: 
      with open('downloaded_file.ext', 'wb') as f: 
       f.write(response.read()) 
      except Exception as e: 
       QMessageBox.critical(None, 'Saving Failed!', str(e), QMessageBox.Ok) 

def load_finished(reply): 
    if not reply: 
     QMessageBox.critical(None, 'Error!', 'An error occurred trying to load the page.', QMessageBox.Ok) 

Ich habe den Code nicht getestet, aber das sollte man auf dem richtigen Weg. Der Code ist von meinem letzten Projekt entlehnt, das Django-Projekte innerhalb von Webview als Desktop-Anwendungen ausführt - https://github.com/awecode/django-runner

+0

helfen Bitte erläutern Sie die Argumente für save_file_callback? Ich erhalte diese Fehlermeldung: Typeerror: save_file_callback() nimmt genau 2 Argumente (1 gegeben) Mein django-Code ist: arg2 = "pathtofile/result321.py" Wrapper = FileWrapper (Datei (arg2)) response = HttpResponse (wrapper, content_type = 'application/force-download') Antwort ['Content-Disposition'] = 'Anhang; filename = "result.py" ' Antwort [' Inhalt-Länge '] = os.path.getsize (arg2) Antwort Antwort –

+0

@Code_aholic versuchen Sie mit dem aktualisierten Code. Wie ich schon sagte, habe ich nicht getestet, ich habe ein oder zwei Probleme im Code hinterlassen. – xtranophilist

+0

Danke! Funktioniert großartig .... Ich musste nur den Code ein wenig ändern, um urllib2 anstelle von urllib zu verwenden. :) –