Evgenij LegotskojMay 10, 2017, 12:38 p.m.

Django - Tutorial 024. Polling with AJAX

Frequent surveys with AJAX allow you to establish a permanent connection between the browser and the server in order to update any data, for example, whether there are new notifications on the site for the user. For example, I organized a small system of notifications for registered users, which allows them to find out at the entrance to the site if there were answers in the articles and forum questions to which they are subscribed, and whether there were new articles and questions on the forum, to sections of which users were also signed.

The notifications are as follows:

Principle of polling operation

The principle is that requests are sent from the user's browser with a certain periodicity, and they check whether there are any changes on the server or not. In case there are any changes, the server sends a response with these changes, otherwise sends a negative result.

To organize the polling frequency, you can use the function setInterval() , which specifies the function and period of the call of this function.

setInterval(function () {
        url: "/get_notifications/",
        type: 'POST',
        data: {'check': true},

        success: function (json) {
            if (json.result) {
                var doc = $.parseHTML(json.notifications_list);
}, 60000);

In this case, the notification is checked once a minute, and if the result of the check is positive, then notifications in the notification panel are replaced by those that were sent from the server. And also the bell of notifications is highlighted in red.

Since the site is running on the VDS server and at the moment does not have such a load, which would be tangible for the server, I render notifications immediately on the server and send the ready-made html code that I want to add to the page in the required place. With increasing load, of course, we will consider the option of sending the purely information that is required to be inserted into the site, and the template will be already javascript code. But this will be realized later

As for the above code, then:

// Highlight the bell
// Create HTML code from the JSON variable
var doc = $.parseHTML(json.notifications_list);
// We replace the html code inside the notification bar

On the Django side, you need to write a view that will be responsible for verifying that the user has notifications:

# -*- coding: utf-8 -*-

import json

from django.http import HttpResponse
from django.views import View
from django.template.loader import render_to_string

class CheckNoticeView(View):
    def post(self, request):

        result = request.user.notice_set.has_unreaded()

        if result:
            return HttpResponse(
                    "result": result,
                    "notifications_list": render_to_string('notifications_list.html', {'user': request.user}),
            return HttpResponse(
                    "result": result,

In this case, requests are performed only for authorized users, which is controlled by the decorator login_required() in the urls.py file. Therefore, we take the user out of the request and check for unread notifications.

  • notice_set - This is query_set of notifications that relate to the user
  • has_unreaded() - This is a special method in the Custom ModelManager that returns true if there are unread notifications and false otherwise.

Further, if there are notifications, then the last 5 pieces are rendered into the HTML code sorted by date and status (Read / Not Read).

In the simplest template, this might look like this:

{% for notice in user.notice_set.all|dictsortreversed:"date"|dictsort:"is_readed"|slice:":5" %}
        {{ notice.content }}
{% endfor %}

In the urls.py file, the view connection looks like this:



In this way, you can organize server polls that will take new notifications from the site for authorized users. This is the most simple mechanism for periodically updating information on the page without rebooting, but also the most expensive on resources.

If your site is on a VDS server and at the same time the load is currently low, and the functionality is very desirable to implement, then this will be the simplest and most effective way to implement some realtime on the site, but you need to monitor the load and, with a significant increase in attendance, move to more efficient ones Techniques for updating information, such as Long Polling and Web Sockets.

For Django I recommend VDS-server of Timeweb hoster .

We recommend hosting TIMEWEB
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.
Support the author Donate

спасибо, продолжай в том же духе


Only authorized users can post comments.
Please, Log in or Sign up

Let me recommend you the excellent hosting on which EVILEG is located.

For many years, Timeweb has been proving his stability.

For projects on Django I recommend VDS hosting

View Hosting
  • Egorka
  • Jan. 18, 2021, 12:31 p.m.

C++ - Тест 003. Условия и циклы

  • Result:0points,
  • Rating points-10
  • Jenek
  • Jan. 17, 2021, 3:40 p.m.

C ++ - Test 004. Pointers, Arrays and Loops

  • Result:10points,
  • Rating points-10

C ++ - Test 004. Pointers, Arrays and Loops

  • Result:90points,
  • Rating points8
Last comments
  • retmas
  • Jan. 17, 2021, 4:09 a.m.

Qt/C++ - Tutorial 074. Generating pseudo-random numbers, using STD library random

Дмитрий, решает. Просто автор, видимо, не сильно озаботился изучением документации QRandomGenerator. Да и в листинге с использованием qrand вызов функции qsrand на каждой итерации цикла нав…

Поздравляю всё Сообщество EVILEG с Новым Годом!!!

#include <iostream>using namespace std;int main() { cout << "Happy New Year and Thank you!"; return 0;}

Django - Tutorial 003. Model, Template, View on Django

from django.shortcuts import *from django.http import *from django.http import HttpResponseRedirectfrom django.contrib.auth.forms import *from django.urls import reverse_lazyfrom django.views …
Now discuss on the forum

Qt: INTERNAL ERROR: failed to install GetMessage hook: 1158

Здравствуйте. Вопрос по простенькому серверу на ПК. Устройства-клиенты подключаются к локальной сети, передают данные на сервер. Задача сервера при каждом подключении клиента (раз в минуту) созд…

Не получается prefetch_related на M2M полях

join случается, если делать select_related префетч делается в два запроса - сначала изначальный запрос, а потом связанные с ним объекты. мерж этих запросов происходит в рантайме можн…

Проблемы с QTableView

кто-нибуль может подсказать как воткнуть QWidget в tableview header ?

QSqlTableModel - Как добавить картинки в таблицу, чтобы они отражались в диалоговом окне, но не были частью модели

Если у вас модель, в переопределнном методе QVariant data надо привязываться к Qt::EditRole, это если открывающийся диалог редактирования является частью таблицы

Работа с потоками в разных версиях Qt

Добрый день, впервые начал проект в котором активно используются потоки и наткнулся на один не очень приятный момент, например: Существует главный поток (GUI) и созданный поток. Связь…
© EVILEG 2015-2020
Recommend hosting TIMEWEB