tutorial Vorlage in Django aktualisieren




django view template (2)

Ich kann nicht daran denken, dies ohne irgendeine Art von Rückruf vom Client zu tun (es sei denn, Sie verwenden einen asynchronen Servermechanismus, etwas, mit dem ich nicht vertraut bin). Eine Möglichkeit wäre, dass der Client den Server nach Erhalt der Benachrichtigung "in_progress" regelmäßig abfragt, um zu sehen, ob die Verarbeitung beendet ist. Die Server-Seite kann in zwei Aufrufe aufgeteilt werden, zuerst um den POST zu behandeln, wie in Ihrer Frage gezeigt, und einen anderen, um herauszufinden und zu berichten, wenn eine bestimmte Aufgabe beendet ist.

Ich habe eine Ansicht wie folgt:

def form1(request):
    if request.method == 'POST':
        form = SyncJobForm(request.POST)
        if form.is_valid():
        # do something
        in_progress = True
        return render_to_response('form1.html', {'in_progress': in_progress})

Ich würde gerne wissen, wie man es einstellt, um die Vorlage zu aktualisieren, nachdem der Ansichtsprozess abgeschlossen ist. Wie das Rendern der Seite nach ihrer Fertigstellung:

        in_progress = True
        return render_to_response('form1.html', {'in_progress': in_progress})
        # after its finished
        finished = True
        return render_to_response('form1.html', {'finished': finished})

Wie kann ich so etwas umsetzen? Danke im Voraus.


Sie können den Status zwischen Seitenaufrufen nicht auf globaler Ebene verwalten, daher müssen Sie Ihre Daten in der Datenbank speichern. Darüber hinaus kann eine Ansicht nach dem Zurückgeben einer Seite nichts mit dem Browser aushandeln. Daher müssen Sie diese in mehrere Ansichten aufteilen und einen separaten Thread für den Job erstellen. Hier ist ein allgemeiner Überblick, der helfen könnte:

def do_something():
    my_job = Jobs.get(id=blah)
    my_job.in_progress = True
    my_job.save()

    # Do some stuff here....

    my_job.in_progress = False
    my_job.save()

def step1(request):
    in_progress = Jobs.get(id=blah).in_progress
    if not in_progress:
        if request.method == 'POST':
            form = SyncJobForm(request.POST)
            if form.is_valid():
                thread.start_new_thread(do_something)
                return HttpResponseRedirect(step2)
            else:
                return render_to_response('form.html', 'form': form)
        else:
            form = SyncJobForm()
            return render_to_response('form.html', 'form': form)
     else:
         return HttpResponseRedirect(step2)

def step2(request):
    in_progress = Jobs.get(id=blah).in_progress
    if in_progress:
        return render_to_response('in_progress.html')
    else:
        return HttpResponseRedirect(finished)

def finished(request):
    return render_to_response('finished.html')

Dann muss Ihre Seite in_progress.html regelmäßig die Seite in_progress.html . Wenn der Job abgeschlossen ist, können Sie in finished.html eine Statusmeldung anzeigen.

Es gibt ausgefeiltere Möglichkeiten, dies zu tun (schreiben Sie Javascript, um den Server regelmäßig abzufragen), aber Sie werden immer noch separate Ansichten schreiben müssen, um mit den entsprechenden Informationen zu antworten. Darüber hinaus können Sie mit einem Job-Management-Framework wie Sellery Jobs erstellen und ausführen, aber auch hier müssen Sie separate Ansichten erstellen, um Statusinformationen zu verarbeiten.





django-templates