Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how to update a Django page without a page reload?

My Django app displays data from a database. This data changes without user intervention, i.e. behind the scenes. Whenever it changes, I would like the webpage to update the changed sections without a full page reload.

Obviously AJAX springs to mind. When the page is loaded initially (or manually, fully re-loaded later on), the rendered template loads a JavaScript that runs window.onload = update("all"), update(...) in turn triggers a number of XMLHTTPRequests which again return data that gets transformed into HTML pieces for the corresponding sections. All works fine. At the initial page load.

Now I find myself in a Python function that saves a new object to the database.

How do I tell the browser to run update(...) ?

Do I need to somehow manually issue a request to a url that is mapped to a view which in turn renders a template that contains the JavaScript code to run update(...) ??? Oh my!

I feel like I'm not following the usual approaches. Maybe I'm just standing to close in front of the problem.

Can anyone help me ?

like image 350
ssc Avatar asked Dec 03 '09 00:12

ssc


2 Answers

2021 update: Use channels: https://channels.readthedocs.io/en/latest/

You have two choices

  1. Have the browser poll using setTimeout()
  2. Look into Comet -- this is a technique for pushing data from the server to the browser.

Here's an article on Comet in Django

like image 181
Lou Franco Avatar answered Oct 20 '22 23:10

Lou Franco


two approaches:

  1. just update the database and wait until the next AJAX query. That means it should do the query periodically, you'll have to balance between immediacy and server load. It helps a little if you can do a cheap query to just verify if there has been an update. Maybe make that check rely only on memcached instead of going to the DB

  2. use comet. In short: the client does an AJAX query asking for the update. the server sees there's no update, so it doesn't answer. Instead, the connection is kept open for a long time. Eventually either the update comes and the server finally answers, or the client times out and kill the connection. In that case, the client should immediately reissue the query to keep waiting for the update.

like image 27
Javier Avatar answered Oct 20 '22 22:10

Javier