Django — это популярная среда Python, используемая для разработки веб-приложений с использованием спецификаций сервера WGSI (интерфейс шлюза веб-сервера) и ASGI (интерфейс шлюза асинхронного сервера). WGSI используется для разработки синхронных приложений Python, а AGSI используется для разработки асинхронных и синхронных веб-приложений. Канал — это полезная функция Django, которая используется для обработки WebSocket, протокола чата и т. д. Наряду с протоколом HTTP. Канал построен по спецификации сервера ASGI. Сеанс двусторонней интерактивной связи между браузером пользователя и сервером можно открыть с помощью WebSocket. Клиент инициирует соединение WebSocket, и сервер отвечает согласием или закрыть сообщение. Сообщения WebSocket проталкиваются в канал с помощью производителей и отправляются потребителям, которые прослушивают канал. В этой статье показано, как использовать каналы для обработки сообщений WebSocket.
Прежде чем практиковать сценарий, показанный в этой статье, обязательно выполните следующие задачи.
Выполните следующую команду, чтобы создать приложение Django с именем socketapp:
$ python3 manage.py startapp socketapp
Выполните следующую команду, чтобы установить канал:
$ pip install channels
Добавьте каналы и имя приложения в часть INSTALLED_APP файла settings.py :
INSTALLED_APPS = [ ….. 'channels', 'socketapp' ]
Определите значение ASGI_APPLICATION в файле settings.py :
Создайте папку с именем templates внутри папки socketapp и установите расположение шаблона приложения в части TEMPLATES файла settings.py :
TEMPLATES = [ { …. 'DIRS': ['/home/fahmida/channel_pro/socketapp/templates'], …. }, ]
Создайте файл шаблона с именем index.html в определенном месте шаблона для отображения данных, отправленных WebSocket. Объект сокета, созданный с помощью JavaScript, будет считывать данные с помощью метода JSON.parse(), а затем передавать значение в содержимое тега <h1>, который содержит значение идентификатора, msg.
<!DOCTYPE html>
<html lang=»en»>
<head>
<meta charset=»UTF-8″>
<title>Учебники по каналу Django</title>
<script>
socket = new WebSocket(«ws://localhost:8000/msg/»);
socket.onmessage = function(e) {
var data = JSON.parse(e.data);
document.querySelector(‘#msg’).innerText = data.timeValue;
}
</script>
</head>
<body>
<center>
<h1 style=»color:blue» id =»msg»>{{ text }}</h1>
</center>
</body>
</html>
Измените views.py файл в socketapp со следующим содержанием. Index.html файл шаблона будет отображаться в браузере с текстом переменной, когда метод index() этого сценария вызывается из urls.py файла. Если сообщение не передается из сокета, в браузере будет отображаться текст «AndreyEx».
views.py
# Импортировать модуль рендеринга из Django from django.shortcuts import render # Создать функцию индекса для отображения HTML-файла в браузере def index(request): return render(request, "index.html", context={'text': 'AndreyEx'})
Измените urls.py файл в socketapp со следующим содержанием. В скрипте определены два пути: путь admin/ используется для открытия панели администрирования Django, а путь msg/ используется для чтения сообщения WebSocket.
urls.py
from django.contrib import admin from django.urls import path from socketapp import views urlpatterns = [ path('admin/', admin.site.urls), path('msg/', views.index) ]
Когда следующий URL-адрес выполняется без определения файлов-потребителей и файлов маршрутизации, протокол HTTP будет работать, и появится следующий вывод.
http://localhost:8000/msg/
Теперь создайте файл consumer.py внутри папки socketapp с помощью следующего скрипта. Метод connect() для ws_consumer будет использоваться для приема подключения к сокету, чтения текущего значения времени каждую секунду и отправки текущего времени в формате JSON через WebSocket, когда этот метод вызывается из файла маршрутизации.
consumers.py
# Импортировать модуль JSON import json # Импортировать WebsocketConsumer from channels.generic.websocket import WebsocketConsumer # Импортировать модуль datetime from datetime import datetime # Импортировать модуль sleep from time import sleep # Определить класс потребителя для отправки данных через class ws_consumer(WebsocketConsumer): def connect(self): self.accept() while(True): now = datetime.now() self.send(json.dumps({'timeValue': now.strftime("%H:%M:%S")})) sleep(1)
Создайте routing.py внутри папки socketapp с помощью следующего скрипта. Путь msg/ определен в сценарии для вызова потребителя для отправки данных в сокет.
routing.py
from django.urls import path from.consumers import ws_consumer # Задайте путь для вызова потребителя ws_urlpatterns = [ path('msg/', ws_consumer.as_asgi()) ]
Измените файл asgi.py с помощью следующего сценария. Модули, необходимые для обработки запросов HTTP и WebSocket, импортируются в сценарий.
asgi.py
# Импортировать модуль os import os # Импортировать get_asgi_application для обработки протокола http from django.core.asgi import get_asgi_application # Import ProtocolTypeRouter и URLRouter для установки маршрутизации веб-сокетов from channels.routing import ProtocolTypeRouter, URLRouter # Import AuthMiddlewareStack для обработки веб-сокета from channels.auth import AuthMiddlewareStack # Импортировать маршрутизацию веб-сокетов from socketapp.routing import ws_urlpatterns # Назначьте значение для DJANGO_SETTINGS_MODULE os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'channel_pro.settings') # Определить переменные приложения для обработки HTTP и WebSocket application = ProtocolTypeRouter({ 'http': get_asgi_application(), 'websocket': AuthMiddlewareStack(URLRouter(ws_urlpatterns)) })
Теперь снова запустите следующий URL-адрес из браузера, чтобы прочитать данные из WebSocket.
http://localhost:8000/msg/
Если потребитель и маршрутизатор работают правильно, в браузере будут отображаться следующие цифровые часы. Здесь маршрутизатор отправил запрос WebSocket, используя путь msg/ к потребителю, который принял запрос и отправил данные в шаблон, чтобы показать цифровые часы в браузере, где второе значение текущего времени обновляется каждые второй.
В этом руководстве показано, как реализовать приложение реального времени с использованием инфраструктуры и каналов Django, создав простые цифровые часы. Другие типы приложений реального времени также могут быть реализованы с использованием Django и каналов, таких как системы онлайн-чата. Скрипты, используемые в этой статье, работают только с Django версии 3+ и Channel версии 3+. Итак, если вы используете более раннюю версию Django или Channel, вам нужно будет обновить версию перед тестированием скрипта, представленного в этом руководстве.