2017-01-31 1 views
0

Auf einem Django-Server habe ich eine Seite mit einer einzigen Schaltfläche, die eine Funktion startet. Diese Funktion dauert eine Weile, und ich habe versucht, Aktualisierungen des Prozesses in eine Variable request.session mit der Absicht zu schreiben, den Inhalt von einer separaten Seite aus zu überprüfen. Es scheint jedoch, dass request.session-Variablen erst aktualisiert werden, wenn die Funktion, in der sie enthalten sind, ausgeführt wird. Zumindest die Variable wird erst dann aktualisiert. Habe ich Recht, und wenn ja, gibt es eine Möglichkeit, in die Variable request.session vor dem Abschluss der Funktion zu schreiben?Aktualisiere request.session-Variable, bevor die Funktion endet

Die Sitzungen sind richtig eingerichtet, ich kann Variablen mit anderen Beispielen schreiben und lesen. Für jetzt mache ich auch nur einen temporären DB-Datensatz, um die Status-Update-Informationen zu speichern und von dort zu lesen, aber ich bin neugierig auf diese Anfrage.Session-Sache - ist meine Annahme richtig, und gibt es einen Weg herum?

Update:

views.py

@login_required 
def autolink(request): 
    result, time = access_check(request, 'super') 
    if not result: 
     return redirect('index') 
    result = f_autolink(request) 
    if result is None: 
     result = request.session.get('technical', '') 
    return render(request, 'autolink.html', {'result': result, }) 

functions.py

def f_autolink(request): 
    if request.method == 'GET': 
     result = None 
    elif request.method == 'POST': 
     request.session['technical'] = 'starting the job' 
     result = f_kzd_autolink(request) 
    else: 
     result = None 
    return result 

def f_kzd_autolink(request): 
    homeless = Kzd.objects.filter(payment__isnull=True, returned=False).distinct() 
    result = [] 
    count = homeless.count() 
    counter = 0 
    request.session['technical'] = 'Starting link job - {c} records to process'.format(c=count) 
    for h in homeless: 
     counter += 1 
     request.session['technical'] = 'Checking record {c1} of {c}'.format(c1=counter, c=count) 
/* long code that makes the h in homeless cycle run for about 3 minutes, unrelated to the question */ 

so grundsätzlich die Ansicht zeigt request.session.get ('technische', ''), aber keine Funktion schreibt an sie, bis sie fertig sind (sie schreibt dann über die Verarbeitung des letzten Datensatzes).

+0

Sie sollten ein [minimales, vollständiges und überprüfbares Beispiel] (http://stackoverflow.com/help/mcve) in Ihre Frage einfügen. Veröffentlichen Sie Ihre Ansicht und was Sie bereits versucht haben. Dann wird es viel einfacher sein, eine Antwort zu geben. – trixn

+0

@trixnn Entschuldigung, Informationen hinzugefügt. –

+1

Wenn Sie lange Berechnungen ausführen müssen, möchten Sie sie wirklich out-of-Band mit einigen asynchronen Task-System wie Sellerie, Rq etc ... –

Antwort

2

Die Sitzung wird pro Anfrage gespeichert, wenn sie in den Einstellungen modified oder settings.SESSION_SAVE_EVERY_REQUEST auf True eingestellt war.

So die einfache Antwort ja, die Sitzung wird von der Sitzung Middleware bei der Verarbeitung der Antwort von einer Ansicht erstellt gespeichert. Aber Sie könnten es manuell tun, indem Sie request.session.save() in Ihrer Ansicht aufrufen.

Wenn Sie Code haben, der sehr lange läuft, wäre es besser, sofort eine Antwort zu erstellen und Werkzeuge wie celery zu verwenden, um Ihre Aufgabe asynchron zu bearbeiten.

Und Sie sollten in Betracht ziehen, Ihre Daten in einer eigenen Datenbanktabelle/einem eigenen Modell zu speichern, wenn es nicht wirklich mit der Benutzersitzung zusammenhängt.

+0

Großartig, das funktioniert. Vielen Dank, das konnte ich alleine aus der Dokumentation nicht herausfinden! Was Sellerie und Db angeht, stimme ich zu. Das war wirklich nur eine schnelle Lösung, die ich für eine separate Aufgabe brauche, also wollte ich nur ein kurzes Update. Sellerie wäre definitiv besser, aber ich habe es noch nicht gelernt. Das Tutorial sitzt allerdings in der Lesezeichenleiste, also hoffe ich bald. –

Verwandte Themen