Question

Ma demande à Django boîte créer quelques-uns très Grandes requêtes SQL. J'utilise actuellement un HttpRequest objet, pour les données dont j'ai besoin, puis un HttpResponse, pour retourner ce que je veux montrer l'utilisateur.

De toute évidence, je peux laisser l'utilisateur attendre une minute pendant que ces nombreux ensembles de requêtes sont exécutés et extraits de la base de données, puis renvoie cette page HTML monolothique.

Idéalement, je voudrais mettre à jour la page quand je veux, quelque chose comme:

For i,e in enumerate(example):

    Table.objects.filter(someObjectForFilter[i]).

    #Return the object to the page.
    #Then Loop again, 'updating' the response after each iteration.

Est-ce possible?

Était-ce utile?

La solution

J'ai découvert récemment qu'une HTTPResponse peut être un générateur:

def myview(request, params):
    return HttpResponse(mygenerator(params))


def mygenerator(params):
    for i,e in enumerate(params):
        yield '<li>%s</li>' % Table.objects.filter(someObjectForFilter[i])

Cela rendra progressivement les résultats de mygenerator à la page, enveloppé dans un HTML <li> pour l'affichage.

Autres conseils

Votre approche est un peu erronée. Vous avez quelques options différentes.

Le premier est probablement le plus facile - utilisez Ajax et HttpRequest. En avoir une série, chacune qui se traduit par un seul Table.objects.filter(someObjectForFilter[i]).. À mesure que chacun se termine, le script termine et renvoie les résultats au client. Le client met à jour l'interface utilisateur et initie la prochaine requête via un autre appel AJAX.

Une autre méthode consiste à utiliser un système de lots. C'est un peu plus élevé, mais probablement un meilleur design si vous optez pour un vrai "lourdeur" dans la base de données. Vous aurez besoin d'avoir un démon de lots en cours d'exécution (une sonde cron fonctionne très bien pour cela) le balayage pour les tâches entrantes. L'utilisateur veut effectuer quelque chose, donc sa demande soumet cette tâche (elle pourrait simplement être une ligne dans une base de données avec ses paramètres). Le démon l'attrape, le traite complètement hors ligne - peut-être même par une autre machine - et met à jour la ligne de tâche lorsqu'elle est complète avec les résultats. Le client peut ensuite actualiser périodiquement pour vérifier l'état de cette ligne, via des méthodes traditionnelles ou ajax.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top