2012-06-22 2 views
0

Мне нужно создать страницу, где одна часть страницы является результатом довольно длительного вычисления, а другая часть - график, который показывает некоторые промежуточные результаты расчета. Способ, которым я его реализовал, состоит в том, что у меня есть две точки зрения. Один вид вычисляет и сохраняет промежуточные результаты в переменной сеанса. Второй вид извлекает промежуточные результаты из переменной сеанса и отображает значения с помощью matplotlib в качестве изображения.django просмотр синхронизации

Проблема в том, что я не могу найти способ выполнения второго представления после выполнения первого представления. Если второе представление выполняется сначала, я вижу старые данные на графике.

Вот некоторые псевдо-код:

views.py:

def calc(request): 
    ... 
    do calculations 
    store interim results in session variable 
    return render_to_response(...'result':value...) 

def graph(request) 
    retrieve interim results from session variable 
    create and return HttpResponse(content_type='image/png') with graph 

urls.py:

(r'^report/$', 'calc',), 
(r'^report/graph.png/$', 'graph',), 

resultAndGraph.html:

Result: {{result}} 
<img src="graph.png" width="400" height="400"> 

ответ

0

Вместо использования переменная сеанса, я бы предложил Эст вам настроить Memcache и использовать Django Caching framework

Если вы хотите использовать два вида, хотя, вы могли бы перенаправить с первого взгляда на второй, используя HttpResponseRedirect

+0

Большое спасибо за предложение. Я это рассмотрю. Есть ли у вас комментарий о синхронизации вызова calc() и graph()? Если я правильно понимаю, то различное кэширование не поможет мне в синхронизации. –

+0

Я не совсем уверен, что вы подразумеваете под синхронизацией. Если вы хотите, чтобы одно представление выполнялось о первом, вы могли бы использовать перенаправление, но он все равно будет медленным для загрузки. – cberner

0

Если у вас есть длительный процесс, использование очередь задач, например celery, и разгружать задачу в отдельный процесс.

На втором экране просто проверьте, завершен ли этот процесс, и затем отобразите обновленную информацию (он также может отображать уведомление о том, что процесс все еще запущен).

Интеграция с django осуществляется через django-celery, который использует механизм кэширования, предложенный @cberner.

+0

Большое спасибо за ответ. Я это попробую. –

Смежные вопросы