Verwenden Sie Kanäle WebSocket-Protokoll zu erreichen

WebSocket-Protokoll und HTTP-Protokoll

Einführung in das HTTP-Protokoll

Er bezieht sich auf den HTTP - Protokoll Hypertext Transfer Protocol ( H yper T EXT T ransfer P rotokoll), die von einem Webserver zu einem Hypertext - Übertragungsprotokoll des lokale Browser gesendet wird, wird das Anwendungsschicht - Protokoll auf dem TCP / IP - Protokoll basiert.

Hauptmerkmale

  1. Einfach und schnell : ein Kundendienst Anfrage an den Server, anstatt die Anforderungsmethode und Pfad zu senden, die Kommunikationsgeschwindigkeit schnell.
  2. Flexibel : HTTP ermöglicht die Übertragung von jeder Art von Datenobjekt.
  3. Connectionless : jede Prozessverbindung Beschränkung nur eine Anfrage. Nachdem der Server verarbeitet Anforderungen Client und empfängt die Kundenantwort, das heißt getrennt. Auf diese Weise kann es Übertragungszeit sparen.
  4. Stateless : HTTP - Protokoll ist staatenlos Protokoll. Kein Staat ist kein Protokoll für die Transaktionsverarbeitung und das Gedächtnis. Wenn der Mangel an Zustand bedeutet , dass die nachfolgende Verarbeitung erforderlich ist vor den Informationen, muss es neu übertragen werden, das für jede Verbindung überträgt in der Datenmenge zur Folge haben kann , wird erhöht. Auf der anderen Seite, wenn erfordert es keine vorherige Information in Reaktion auf einen schnelleren Server.
  5. Unterstützt Client / Server-Modell

Werk

HTTP wird auf Client / Server-Modell und verbindungsorientiert. Eine typische Transaktion HTTP hat den folgenden Prozess:

  1. Kunden, um eine Verbindung mit dem Server herzustellen;

    1. Kundenanforderung an den Server;
    2. Server übernimmt die Anforderung und gibt die entsprechende Datei entsprechend einer Anforderung als Antwort;
    3. Client und Server schließt die Verbindung.

WebSocket-Protokoll Übersicht

Nun, viele Websites, um Push-Technologie zu erreichen, verwendet die Technologie Ajax Polling. Polling ist in einem bestimmten Zeitintervall (beispielsweise alle 1 Sekunde), gibt eine HTTP-Anforderung an den Server von dem Browser, und gibt die aktuellen Daten an den Client-Browser von dem Server. Das traditionelle Modell bringt offensichtlichen Nachteil, dass der Browser ständige Anforderung an den Server erfordert jedoch HTTP-Anfragen können einen langen Kopf enthalten, die wirklich effektive Daten nur ein kleiner Teil sein können, offensichtlich werden dieser Abfall viel Bandbreite Ressourcen.

HTML5 WebSocket-Protokoll Definition, besser in der Lage Server-Ressourcen und Bandbreite zu sparen, und kann mehr Echtzeit-Kommunikation sein.

WebSocket ist ein Protokoll für Vollduplex - Kommunikation über eine einzige TCP - Verbindung. WebSocket ermöglicht den Austausch von Daten zwischen dem Client und dem Server zu erleichtern, so dass der Server aktiv Daten an das Client pushen . In der WebSocket - API, der Browser und der Server benötigt nur einen Händedruck zu vervollständigen, direkt zwischen den beiden schaffen eine dauerhafte Verbindung und bidirektionale Datenübertragung .

Django Kanäle WebSocket Echtzeit-Kommunikation erreichen

offizielle Dokumente

Kanäle sind eine Funktion Django und das Projekt auf andere als HTTP zu erweitern, das WebSocket - Protokoll zu handhaben . Es wird auf der Grundlage genannt ASGI der Python Build - Spezifikation.

Als nächstes auf der Grundlage der Verwendung von offiziellen Tutorial1-2 kurze Kanäle.

Zuerst müssen Sie Django und Kanäle installieren

pip install django
pip install channels

Erstellen Sie ein Django-Projekt und geben Sie das Projekt Stammverzeichnis:

django-admin startproject mysite
cd mysite

Als Nächstes erstellen Sie die Root - Kanäle von Routing - routing.pyKanäle Konfiguration Routing ähnlich wie Django URLconf, sagt sie Kanäle Kanäle Wenn der Server , welcher Code empfängt , wenn die HTTP - Anforderung auszuführen.

Zunächst wird eine leere Routing - Konfiguration von Anfang an , erstellen Sie eine Datei , mysite/routing.pydie den folgenden Code enthält:

# mysite/routing.py
from channels.routing import ProtocolTypeRouter

application = ProtocolTypeRouter({
    # (http->django views is added by default)
})

Dann Bibliothek Kanäle in der App-Liste registrieren:

# mysite/settings.py
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    # 新添加
    'channels',
]

Weiter bearbeiten Sie mtsite/settings.pydie Kanäle in die Wurzel - Routing - Konfiguration, fügen Sie den folgenden Code:

# mysite/settings.py
# Channels
ASGI_APPLICATION = 'mysite.routing.application'

Die Kanäle können zu diesem Zeitpunkt gesteuert werden runserverBefehl anstelle des durch Kanäle Server Django Entwicklungs - Server entwickelt Standard.

Führen Sie Django-Projekt:

py manage.py runserver

Sie erhalten die folgende Ausgabe:

Performing system checks...

System check identified no issues (0 silenced).

You have 17 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
March 07, 2020 - 22:45:04
Django version 3.0.2, using settings 'mysite.settings'
Starting ASGI/Channels version 2.4.0 development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.
HTTP GET / 200 [0.04, 127.0.0.1:54871]

Man kann sehen, Starting ASGI/Channels development server at http://127.0.0.1:8000/von Django Entwicklungs - Server, was darauf hindeutet Kanäle Entwicklungs - Server , das Projekt zu übernehmen. Öffnen Sie den Startbildschirm , werden Sie die vertraute kleine Rakete sehen:

Fahren Sie den Server, erstellen App event:

py manage.py startapp event

Registrieren App:

# mysite/settings.py

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'channels',
    # 新添加
    'event',
]

Im Stammverzeichnis einen neuen Ordner erstellen templatesund die templates/eventOrdner zu HTML - Datei, mysite/settings.pyfügen Sie den Pfad:

# mysite/settings.py
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        # 修改
        'DIRS': [os.path.join(BASE_DIR, 'templates').replace('\\', '/')],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

In templatesHinzufügen der View - Datei event/list.html, wobei die angeforderten Teil WebSocket - Vorlage wie folgt:

<script type="text/javascript">
	function Filter() {
        if ("WebSocket" in window) {
            //alert("您的浏览器支持WebSocket!");
            // 重定向URL
            let ws = new WebSocket("ws://"+ window.location.host + "/ws/event/list/");
            ws.onopen = function () {
                ws.send(JSON.stringify({
                    'message': "测试",
                    // 需要传输的数据
                }));
            }
            ws.onmessage = function (evt) {
                let received_msg = JSON.parse(evt.data);
                let feed_back = received_msg['feedback'];
                alert(feedback);
                // 处理接受数据
            }
            ws.onclose = function () {
                //alert("WebSocket连接已关闭...");
            }
        }
        else {
            alert("你的浏览器不支持WebSocket!");
        }
    }
</script>

Erstellen Sie eine Ansicht Funktion event/views.py:

# event/views.py
from django.shortcuts import render

def list(request):
    return render(request, 'event/list.html', {})

Erstellen Sie eine Route event/urls.py:

# event/urls.py
from django.urls import path

from . import views

urlpatterns = [
    path('list/', views.list, name='list'),
]

Wird event appdie Route zum Projektstamm Route hinzufügen:

# mysite/urls.py
from django.conf.urls import include
from django.urls import path
from django.contrib import admin

urlpatterns = [
    path('admin/', admin.site.urls),
    path('event/', include('event.urls', namespace='event')),
]

Kanäle Bearbeitung des Antrags:

1. Channels接受HTTP请求
2. 查询根URLconf查找**消费者(consumer)**
3. 在**消费者(consumer)**中调用各种功能来处理连接的事件

Erstellen Sie einen Verbraucher (Verbraucher) Datei event/consumers.py:

event/
    __init__.py
    ……
    consumers.py
    ……
    urls.py
    views.py

Code-Templates sind wie folgt:

# event/consumers.py
from channels.generic.websocket import WebsocketConsumer
import json

class ListDataConsumer(WebsocketConsumer):
    def connect(self):
        self.accept()

    def disconnect(self, close_code):
        pass

    def receive(self, text_data):
    	# 字典化接收数据
        text_data_json = json.loads(text_data)
        message = text_data_json['message']
        # 数据处理
        self.send(text_data=json.dumps({
        'feedback': "Accept",
        # 返回数据
    }))

Ist consumers.pyauf Route neu konfiguriert event/routing.py:

# event/routing.py
from django.urls import re_path

from . import consumers

websocket_urlpatterns = [
    re_path(r'ws/event/list/$', consumers.ListDataConsumer),
]

Dann die Wurzelroutenpunkte event/routing.pyder Datei:

# mysite/routing.py
from channels.auth import AuthMiddlewareStack
from channels.routing import ProtocolTypeRouter, URLRouter

import event.routing

application = ProtocolTypeRouter({
    # (http->django views is added by default)
    'websocket': AuthMiddlewareStack(
        URLRouter(
            event.routing.websocket_urlpatterns
        )
    ),
})

Diese Routing - Konfiguration root angegeben wird, wenn eine Verbindung mit dem Server Kanälen Entwicklung Festlegung, ProtocolTypeRouterwird zunächst die Art der Verbindung prüfen. Wenn es WebSocket - Verbindung (ist : // WS oder WSS: // ), die Verbindung zugewiesen AuthMiddlewareStack.

In AuthMiddlewareStackder Füllanschluss von dem Bereich der aktuelle Benutzerauthentifizierung zu bedecken und dann einer Verbindung zu URLRouter. Dies URLRouterwird auf Forschung basieren, bietet Konnektivität zu routen HTTP - Pfad zu einem bestimmten Verbraucher-basiertes urlModell.

Nach der Migration Datenbank-Modell:

py manage.py makemigrations
py manage.py migrate

Führen Sie das Projekt:

py manage.py runserver

Wenn die Verbindung hergestellt ist, sollte der Hintergrund die folgende Anzeige haben:

HTTP GET /event/list/ 200 [0.06, 127.0.0.1:58855]
WebSocket HANDSHAKING /ws/event/list/ [127.0.0.1:58906]
WebSocket CONNECT /ws/event/list/ [127.0.0.1:58906]

Zusammenfassung

Kanäle verwenden, um die obigen allgemeinen Verfahren, die folgende Konfiguration ASGI, Kanäle Server die ursprüngliche Django-Server ersetzen wird die Anforderung verarbeitet.

Nur wenn für den Einsatz WebSocket - Protokoll für Echtzeit - Kommunikation Bedürfnisse erforderlich ist, um so konfiguriert werden , routing.pyund consumers.pydurch die routing.pyPunkt consumers.pyVerarbeitung WebSocket Anforderung, vor der Verwendung nur die verbleibenden HTTP - Protokollanforderungen verwenden und es gibt keinen Unterschied .

Da nur eine App bei einem Projekt in der Nutzung der Kanäle, können Sie auf den beziehen Projektcode von event.

Ich denke du magst

Origin www.cnblogs.com/liyishan/p/12624106.html
Empfohlen
Rangfolge