Evgenii Legotckoi
Evgenii Legotckoi10. Mai 2017 12:38

Django - Tutorial 024. Polling mit AJAX

Durch häufiges Abfragen mit AJAX können Sie eine ständige Verbindung zwischen dem Browser und dem Server herstellen, um einige Daten zu aktualisieren, z. B. ob es neue Benachrichtigungen auf der Website für den Benutzer gibt. Zum Beispiel habe ich ein kleines Benachrichtigungssystem für registrierte Benutzer eingerichtet, das es ihnen ermöglicht, beim Betreten der Website zu erfahren, ob die von ihnen abonnierten Artikel und Forumsfragen beantwortet wurden und ob neue Artikel und Fragen auf der erschienen sind Forum, auf deren Abschnitten Benutzer auch angemeldet waren.

Benachrichtigungen sehen so aus:


Wie häufig Umfragen funktionieren

Das Prinzip besteht darin, dass vom Browser des Benutzers in einer bestimmten Frequenz Anfragen gesendet werden, die prüfen, ob Änderungen auf dem Server vorliegen oder nicht. Wenn es Änderungen gibt, dann sendet der Server eine Antwort mit diesen Änderungen, andernfalls sendet er ein negatives Ergebnis.

Um die Abfragehäufigkeit zu organisieren, können Sie die Funktion setInterval() verwenden, die die Funktion und den Zeitraum für den Aufruf dieser Funktion festlegt.

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

        success: function (json) {
            if (json.result) {
                $('#notify_icon').addClass("notification");
                var doc = $.parseHTML(json.notifications_list);
                $('#notifications-list').html(doc);
            }
        }
    });
}, 60000);

In diesem Fall wird einmal pro Minute eine Benachrichtigungsprüfung aufgerufen, und wenn das Ergebnis der Prüfung positiv ist, werden Benachrichtigungen im Benachrichtigungsfeld durch die vom Server gesendeten ersetzt. Die Benachrichtigungsglocke ist ebenfalls rot hervorgehoben.

Da die Seite auf dem VDS-Server läuft und derzeit keine solche Last hat, die für den Server spürbar wäre, rendere ich Benachrichtigungen sofort auf dem Server und senden Sie vorgefertigten html -Code, der an der gewünschten Stelle auf der Seite eingefügt werden muss. Bei steigender Auslastung wird natürlich die Möglichkeit in Betracht gezogen, reine Informationen zu senden, die zum Einfügen in die Seite benötigt werden, und das Templating erfolgt per Javascript -Code. Dies wird aber später umgesetzt

Was den obigen Code betrifft:

// Подсвечиваем колокольчик
$('#notify_icon').addClass("notification");
// Создаём HTML код из JSON переменной
var doc = $.parseHTML(json.notifications_list);
// Заменяем html код внутри панели уведомлений
$('#notifications-list').html(doc);

Auf der Django -Seite müssen Sie eine Ansicht schreiben, die dafür verantwortlich ist, zu prüfen, ob der Benutzer Benachrichtigungen hat:

# -*- 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(
                json.dumps({
                    "result": result,
                    "notifications_list": render_to_string('notifications_list.html', {'user': request.user}),
                }),
                content_type="application/json"
            )
        else:
            return HttpResponse(
                json.dumps({
                    "result": result,
                }),
                content_type="application/json"
            )

In diesem Fall werden Anfragen nur für autorisierte Benutzer gestellt, was durch den Decorator login_required() in der Datei urls.py gesteuert wird. Daher nehmen wir den Benutzer aus der Anfrage und prüfen auf ungelesene Benachrichtigungen.

request.user.notice_set.has_unreaded()
  • notice_set ist das query_set von Benachrichtigungen, die sich auf den Benutzer beziehen
  • has_unreaded() ist eine spezielle Methode im benutzerdefinierten ModelManager, die true zurückgibt, wenn es ungelesene Benachrichtigungen gibt, und andernfalls false.

Außerdem werden bei Benachrichtigungen die letzten 5 Teile in HTML-Code gerendert, sortiert nach Datum und Status (Gelesen/Ungelesen).

In der einfachsten Vorlage könnte es so aussehen:

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

In der Datei urls.py sieht die Ansichtsverbindung so aus:

url(r'^notice/(?P<pk>\d+)/read/$',
    login_required(views.ReadNoticeView.as_view()),
    name='notice_read'),

Ergebnisse

Auf diese Weise können Sie Serverumfragen organisieren, die neue Benachrichtigungen von der Site für autorisierte Benutzer sammeln. Dies ist der einfachste Mechanismus zum regelmäßigen Aktualisieren von Informationen auf der Seite ohne Neuladen, aber auch der ressourcenintensivste.

Wenn sich Ihre Site auf dem VDS-Server befindet und die Last derzeit gering ist und Sie die Funktionalität wirklich implementieren möchten, ist dies das einfachste und einfachste effektivste Weg, um etwas Echtzeit auf der Website zu implementieren, aber Sie müssen die Auslastung überwachen und bei einer erheblichen Zunahme des Datenverkehrs auf effizientere Methoden zur Aktualisierung von Informationen umsteigen, wie z. B. Long Polling und Web Sockets.

Für Django empfehle ich Timeweb-Hoster VDS-Server .

Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Stabiles Hosting des sozialen Netzwerks EVILEG. Wir empfehlen VDS-Hosting für Django-Projekte.

Magst du es? In sozialen Netzwerken teilen!

d
  • 26. Februar 2018 07:50

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

Kommentare

Nur autorisierte Benutzer können Kommentare posten.
Bitte Anmelden oder Registrieren
Letzte Kommentare
ИМ
Игорь Максимов5. Oktober 2024 07:51
Django – Lektion 064. So schreiben Sie eine Python-Markdown-Erweiterung Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas55. Juli 2024 11:02
QML - Lektion 016. SQLite-Datenbank und das Arbeiten damit in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
k
kmssr8. Februar 2024 18:43
Qt Linux - Lektion 001. Autorun Qt-Anwendung unter Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
Qt WinAPI - Lektion 007. Arbeiten mit ICMP-Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
EVA
EVA25. Dezember 2023 10:30
Boost - statisches Verknüpfen im CMake-Projekt unter Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
Jetzt im Forum diskutieren
J
JacobFib17. Oktober 2024 03:27
добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
JW
Jhon Wick1. Oktober 2024 15:52
Indian Food Restaurant In Columbus OH| Layla’s Kitchen Indian Restaurant If you're looking for a truly authentic https://www.laylaskitchenrestaurantohio.com/ , Layla’s Kitchen Indian Restaurant is your go-to destination. Located at 6152 Cleveland Ave, Colu…
КГ
Кирилл Гусарев27. September 2024 09:09
Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
F
Fynjy22. Juli 2024 04:15
при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

Folgen Sie uns in sozialen Netzwerken