2015-02-07 3 views
0

Я искал эту концепцию, но на самом деле не понимаю, как она работает. В моем бэкэнд используется webapp2 и GAE, и я хочу обновить страницу, которая извлекается из моей базы данных.Как обновить только часть страницы с помощью GAE

На странице есть другой контент, и мне нужно только обновить содержимое таблицы. В настоящее время я нахожусь с помощью

<meta http-equiv="refresh" content="10"> 

обновить всю страницу каждые 10 секунд, но мне нужно что-то, что только обновляет часть страницы. Объяснение любых дополнений JS или JQuery было бы замечательным!

Часть, которую я действительно не понимаю, это то, что мне нужно изменить на бэкэнд, чтобы это было освежающим.

+0

Все, что вам нужно с стороны GAE, является обработчиком для URL-адрес, обслуживающий только JSON соответствующих данных. На сценарии JS это вызов ajax, самый простой в JQuery. Чтобы получить более сложные, а не периодические опросы, вы можете использовать Channel, https://cloud.google.com/appengine/docs/python/channel/, постоянное соединение, которое позволяет серверу инициировать отправку при обнаружении изменений, чтобы JS не выполнял 't должен опросить - теперь *, что * классно. Но, лучше, начните просто, я думаю. –

+0

Сладкий! Это объяснение имеет смысл. Поработаем над этим и вернемся к вам. Спасибо за ссылку о канале. Выглядит очень круто. – tabchas

+0

Уходящий канал на будущее Я набросал скелет (но все еще длинный, почти исключительно на стороне html/js/jquery вещей - часть GAE действительно тривиальна!). Итак, как вы можете видеть, «то, что мне нужно изменить на бэкэнде, чтобы позволить этот вид освежения» (без канала, просто по опросу) «по сути ничего общего со всеми намерениями и целями» :-) –

ответ

2

Простой HTML-заполнитель:

<div id="tablehere"></div> 

Кодекса Jquery для AJAX-опроса каждые 10 секунд:

setInterval(function(){ 
    $.ajax({ url: "http://yourapp.appspot.com/thetable", 
      success: function(data) { 
       maketable(data); 
      } 
      }); 
}, 10000); 

JS сделать и показать новую таблицу (есть миллион альтернатив здесь и Я не эксперт JS, это только один из способов):

maketable = function(data) { 
    var tabdiv = document.getElementById("tablehere"); 
    var tabhead = '<table><thead><tr><th>Col1</th><th>Col2</th></tr></thead><tbody>'; 
    for(var i=0,len=data.length; i<len; i++) { 
    tabhead += '<tr><td>' + data[i].col1 + '</td><td>' + data[i].col2 + '</td></tr>'; 
    } 
    tabhead += '</tbody></table>'; 
    tabdiv.innerHTML = tabhead ; 
} 

и все, клиенты.

стороне сервера, app.yaml будет иметь обработчик

url: /thetable 
script: thetable.app 

и в thetable.py после всех необходимых импорта:

class Tablerow(ndb.Model): 
    col1: ndb.StringProperty() 
    col2: ndb.StringProperty() 

class Tablehandler(webapp2.RequestHandler): 
    def get(self): 
     data = [tr.to_dict() for tr in Tablerow.query().iter()] 
     response.write(json.dumps(data)) 

app = webapp2.WSGIApplication([('/thetable', Tablehandler)]) 

Уф - очень скелетную, но все же мне потребовалось некоторое время, чтобы написать , Но, как вы видите, часть движка приложения действительно тривиальна - это HTML, Javascript и JQuery, которые занимают на себе большую часть усилий! -)

+0

Спасибо! Любая проблема опроса очень быстрая (.2 секунды или просто сдача 0)? Мне нужно его быстро обновлять, и приложение будет использоваться только 1 час за раз. Я вижу решение канала как что-то в будущем, но это быстрое решение, которое я хочу. – tabchas

+0

@tabchas, чем чаще вы проводите опрос, тем больше нагрузки вы ставите как на свой сервер, так и на браузеры пользователей. Только экспериментирование может рассказать вам, сколько нагрузки слишком много, в зависимости от того, сколько, конечно, от того, сколько браузеров подключается к вашему приложению GAE одновременно. –

+0

Понял. Другой вопрос: я хочу, чтобы пользователи открывали эту веб-страницу, и всякий раз, когда они находятся на этой странице, она обновляет сервер, который находится на странице.Он должен работать только тогда, когда пользователь действительно смотрит на веб-страницу (неактивен, например, на вкладках переключения). Один из способов сделать это, который я реализовал, - это держать пинг сервера, говорящего, что я жив. Будет ли API канала быть чем-то полезным в этом случае? – tabchas

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