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
- Einfach und schnell : ein Kundendienst Anfrage an den Server, anstatt die Anforderungsmethode und Pfad zu senden, die Kommunikationsgeschwindigkeit schnell.
- Flexibel : HTTP ermöglicht die Übertragung von jeder Art von Datenobjekt.
- 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.
- 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.
- Unterstützt Client / Server-Modell
Werk
HTTP wird auf Client / Server-Modell und verbindungsorientiert. Eine typische Transaktion HTTP hat den folgenden Prozess:
-
Kunden, um eine Verbindung mit dem Server herzustellen;
- Kundenanforderung an den Server;
- Server übernimmt die Anforderung und gibt die entsprechende Datei entsprechend einer Anforderung als Antwort;
- 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
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.py
Kanä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.py
die 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.py
die 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 runserver
Befehl 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 templates
und die templates/event
Ordner zu HTML - Datei, mysite/settings.py
fü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 templates
Hinzufü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 app
die 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.py
auf 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.py
der 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, ProtocolTypeRouter
wird zunächst die Art der Verbindung prüfen. Wenn es WebSocket - Verbindung (ist : // WS oder WSS: // ), die Verbindung zugewiesen AuthMiddlewareStack
.
In AuthMiddlewareStack
der Füllanschluss von dem Bereich der aktuelle Benutzerauthentifizierung zu bedecken und dann einer Verbindung zu URLRouter
. Dies URLRouter
wird auf Forschung basieren, bietet Konnektivität zu routen HTTP - Pfad zu einem bestimmten Verbraucher-basiertes url
Modell.
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.py
und consumers.py
durch die routing.py
Punkt consumers.py
Verarbeitung 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
.