Pergunta

Minha aplicação em django posso Crie alguns muito Grandes consultas SQL. Eu atualmente uso um HttpRequest objeto, para os dados de que preciso, então um HttpResponse, para devolver o que quero mostrar ao usuário.

Obviamente, posso deixar o usuário aguardar um minuto enquanto esses muitos conjuntos de consultas estão sendo executados e extraídos do banco de dados e, em seguida, retorne esta página monolotica HTML.

Idealmente, gostaria de atualizar a página quando eu quiser, algo como:

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.

Isso é possível?

Foi útil?

Solução

Descobri recentemente que um HTTPRESPOSE pode ser um gerador:

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])

Isso retornará progressivamente os resultados de mygenerator para a página, embrulhado em um html <li> para exibição.

Outras dicas

Sua abordagem é um pouco falha. Você tem algumas opções diferentes.

O primeiro é provavelmente o mais fácil - use Ajax e HttPrequest. Ter uma série destes, cada uma das quais resulta em um único Table.objects.filter(someObjectForFilter[i]).. À medida que cada um termina, o script completa e retorna os resultados ao cliente. O cliente atualiza a interface do usuário e inicia a próxima consulta através de outra chamada AJAX.

Outro método é usar um sistema em lote. Isso é um pouco mais pesado, mas provavelmente um design melhor se você estiver buscando um "levantamento pesado" real no banco de dados. Você precisará fazer um daemon em lote (uma sonda Cron funciona muito bem para isso) digitalizando tarefas de entrada. O usuário deseja executar algo, para que a solicitação envie esta tarefa (pode ser simplesmente uma linha em um banco de dados com seus parâmetros). O daemon o agarra, o processa completamente offline - talvez até por uma máquina diferente - e atualiza a linha da tarefa quando estiver completa com os resultados. O cliente pode atualizar periodicamente para verificar o status dessa linha, através dos métodos tradicionais ou Ajax.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top