2009-12-09 3 views
2

Как описано в how to update a Django page without a page reload?, я отправляю периодические XMLHTTPRequests из браузера на сервер с помощью JavaScript, чтобы эти части веб-страницы менялись в ходе моего приложения.как автоматически обновлять страницу Django только при необходимости?

Однако в большинстве случаев ничего не меняется; сервер отвечает с тем же ответом, и браузер обновляет веб-страницу с содержимым, которое уже было там.

Очевидно, что сервер должен отвечать только в случае появления новых данных.

Тщательное исследование в Интернете составило http://ajaxpatterns.org/Periodic_Refresh#Lace, но dcoumentation является кратким, и я изо всех сил пытаюсь реализовать концепцию в своем проекте Django. Я с трудом верю, что это не было сделано раньше.

Кто-нибудь знает какие-либо дополнительные ресурсы, которые я мог бы использовать в качестве ориентира?

+1

На странице, с которой вы связались, есть хорошая методика: хеш-содержимое, включающее хеш в ответе, отправку хэша на сервер по таймеру и проверку сервером хэша, чтобы узнать, отправлять ли еще сообщения , С какой частью вам нужна помощь? –

ответ

7

Трудность ответа заключается в незнании того, какие серверные ресурсы возвращаются пользователю.

Я сделаю что-то, что может служить примером. Допустим, вы разрабатывали приложение, которое позволяло вам отслеживать в режиме реального времени комментарии, сделанные пользователями на вашем сайте. Мы можем сделать несколько вещей, чтобы сделать это возможным:

  1. Сервер отслеживает, когда комментарии были добавлены (.created поля)
  2. API-интерфейс, чтобы получить последние комментарии требуют от нас, чтобы указать, сколько лет комментариев мы хотим
  3. В представлении запросов и возвращает только те, которые были добавлены с тех пор

models.py

class Comment(models.Model): 
    text = models.TextField() 
    created = models.DateTimeField(default=datetime.now()) 

urls.py

url(r'^comments/latest/(?P<seconds_old>\d+)/$',get_latest_comments), 

views.py

def get_latest_comments(request, seconds_old): 
    """ 
    Returns comments that have been created since the last given number of seconds 
    have elapsed. 
    """ 

    # Query comments since the past X seconds 
    comments_since = datetime.datetime.now() - datetime.timedelta(seconds=seconds_old) 
    comments = Comments.objects.filter(created__gte=comments_since) 

    # Return serialized data or whatever you're doing with it 
    return HttpResponse(simplejson.dumps(comments),mimetype='application/json') 

На стороне клиента Вы получаете JSON, проверить, если он имеет значение, если это перечисление элементов, и добавьте новые элементы в свой тег <div> или что угодно.


Как вы можете видеть, развитие API для возвращения только недавно обновленные элементы собирается меняться в зависимости от того, что содержание сервер возвращается.

С вашего вопроса кажется, что вы хотите, чтобы сервер управлял определением того, что было недавно обновлено, а не клиентом (что является хорошей стратегией).В таком случае, что вам нужно сделать, это определить:

  1. Как сервер будет отслеживать изменения (в моем примере, что это делается с помощью «созданных» полей)
  2. Как клиент собирается запросить эти изменения
  3. Как сервер будет определять, какие изменения произошли, чтобы вернуть их клиенту через API?
+0

Большое вам спасибо за то, что нашли время и предоставили такой подробный ответ! Я думаю, что моя проблема заключалась в том, что я в основном разбираюсь в деталях, но не вижу, как все это происходит. Мое приложение в основном работает сейчас, всего несколько деталей (о которых я, вероятно, попрошу о помощи в другом вопросе ;-) Еще раз спасибо! Отличная работа! – ssc

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