2017-01-23 4 views
0

Zusammenfassung meiner Website: Ein Benutzer gibt einige Informationen ein, die nach dem Klicken auf "Abschicken" über AJAX an das Backend übermittelt werden. Wenn das Back-End die Information empfängt, erzeugt es eine DOCX unter Verwendung der Information und liefert diese DOCX-Datei an den Benutzer zurück.PythonAnywhere So behandeln Sie mehrere "Web Worker" oder Prozesse

Hier ist mein AJAX-Code in meiner HTML-Datei

$.ajax({ 
     type:'POST', 
     url:'/submit/', 
     data:{ 
      data that I submit 
     }, 
     dateType: 'json', 
     success:function() { 
      document.location = "/submit"; 

     } 
    }) 

für My Views Funktion/einreichen/die send_file Datei

def submit(request): 

    #Receive Data 
    #Create a File with the Data and save it to the server 

    return send_file(request) 

def send_file(request): 

    lastName = get_last_name() +'.docx' 
    filename = get_full_path() # Select your file here.         
    wrapper = FileWrapper(open(filename , 'rb')) 
    response = HttpResponse(wrapper, content_type='application/vnd.openxmlformats-officedocument.wordprocessingml.document') 
    response['Content-Disposition'] = 'attachment; filename=' + lastName 
    response['Content-Length'] = os.path.getsize(filename) 

    return response 

Das funktioniert zurück verwendet wird nun einwandfrei für einige Zeit. Ich hatte jedoch Probleme, als ich die Anzahl der "Web-Worker"/Prozesse von 1 auf 4 in meinem Hosting-Account erhöhte. Was passiert, ist, dass ein anderer Web-Mitarbeiter zum Senden der Datei verwendet wird, wodurch eine neue Instanz der Website erstellt wird. Das Problem dabei ist, dass die neue Instanz nicht den Dateipfad enthält, der mit dem Web-Worker erstellt wird, der die Datei erstellt.

Wie gesagt, das funktionierte einwandfrei, wenn meine WebApp nur einen "Web Worker" oder einen Prozess hatte. Jetzt habe ich nur noch eine Erfolgsquote von etwa 50%.

Es ist fast wie ein Prozess versucht, die Datei zu senden, bevor es erstellt wurde. Oder der Prozess hat keinen Zugriff auf den Dateinamen des Prozesses, der ihn erstellt hat.

Jede Hilfe würde sehr geschätzt werden. Vielen Dank!

Code Versucht, Pfadname über Anfrage und dann zurück an den Server zu senden.

Senden Zeigen Sie die zurückgelieferten Dateiinformationen zurück an ajax.

def submit(request): 
    # Receive DATA 
    # Generate file with data 

    lastName = get_last_name() +'.docx' 
    filename = get_full_path() # Select your file here. 


    return HttpResponse(json.dumps({'lastname': lastName,'filename':filename}), content_type="application/json") 

Erfolg Funktion von AJAX

success:function(fileInfo) { 
     name_last = fileInfo['lastname'] 
     filepath= fileInfo['filepath'] 
     document.location = "/send"; 
    } 

So kann ich die Fileinfo mit dem "/ senden" schicken?

+0

Bitte fügen Sie get_full_path() hinzu, es wird zum Debuggen benötigt. – Fian

Antwort

1

Jeder Web-Worker ist ein separater Prozess. Sie haben keinen Zugriff auf Variablen, die in einem anderen Worker festgelegt sind. Jede Anfrage kann an jeden Mitarbeiter gesendet werden, so dass nicht garantiert werden kann, dass Sie den Dateinamen verwenden, der für einen bestimmten Benutzer festgelegt wurde. Wenn Sie Informationen zwischen Anforderungen austauschen müssen, müssen Sie sie außerhalb des Arbeitsspeichers speichern. Sie können dies in einem Cookie, in einer Datenbank oder in einer Datei tun.

+0

Okay, wie mache ich das? Ich habe versucht, den file_path durch die Einreichung zurück zu senden, die funktionierte. Aber ich konnte nicht herausfinden, wie man die Erfolgsfunktion dazu bringt, den Dateipfad zurückzusenden. Ist das sinnvoll? Ich habe den Code, den ich oben versucht habe, hinzugefügt. Danke für Ihre Hilfe! –

+0

Nevermind, ich habe es funktioniert! Ich habe Cookies verwendet, um den Dateipfad zu halten. Danke für Ihre Hilfe –