Utilizar canales para lograr protocolo WebSocket

protocolo WebSocket y el protocolo HTTP

Introducción al protocolo HTTP

Se refiere al Protocolo de protocolo de transferencia de hipertexto HTTP ( H yper T EXT T RANSFERENCIA P ROTOCOLO), se transmite desde un servidor web a un protocolo de transferencia de hipertexto el navegador local, el protocolo de capa de aplicación se basa en el protocolo TCP / IP.

Las características principales

  1. Simple y rápido : una solicitud de servicio al cliente al servidor, en lugar de enviar el método de la petición y la ruta, la velocidad de comunicación rápidamente.
  2. Flexible : HTTP permite la transmisión de cualquier tipo de objeto de datos.
  3. Sin conexión : cada proceso de restricción conexión sólo una petición. Después de que el servidor procesa las solicitudes del cliente y recibe la respuesta del cliente, es decir, desconectado. De esta manera se puede ahorrar tiempo de transmisión.
  4. Stateless : HTTP protocolo es un protocolo sin estado. Ningún estado hay un protocolo para el procesamiento de transacciones y la memoria. Si se aumenta la falta de medios estatales que el posterior procesamiento requerida en frente de la información, que debe ser retransmitido, que puede resultar en la cantidad de datos transmitidos para cada conexión. Por otro lado, cuando no requiere información previa en respuesta a un servidor más rápido.
  5. Soportes modelo cliente / servidor

obras

HTTP se basa en cliente / servidor de modelo, y orientado a la conexión. Una transacción típica HTTP tiene el siguiente proceso:

  1. Clientes para establecer una conexión con el servidor;

    1. la petición del cliente al servidor;
    2. Servidor acepta la solicitud y devuelve el archivo correspondiente de acuerdo a una solicitud como una respuesta;
    3. El cliente y el servidor cierra la conexión.

Descripción general del protocolo WebSocket

Ahora, muchos sitios a fin de lograr la tecnología push, la tecnología utilizada es el Ajax de votación. El sondeo es en un intervalo de tiempo específico (por ejemplo, cada 1 segundo), emite una solicitud HTTP al servidor por el navegador, y devuelve los últimos datos al navegador del cliente por el servidor. Este modelo tradicional trae desventaja obvia de que el navegador requiere constante petición al servidor, sin embargo, las solicitudes HTTP pueden contener una cabeza larga, que los datos verdaderamente eficaces pueden ser sólo una pequeña parte, obviamente, esto será un desperdicio una gran cantidad de recursos de ancho de banda.

HTML5 WebSocket definición del protocolo, más capaces de ahorrar los recursos del servidor y el ancho de banda, y puede ser más comunicación en tiempo real.

WebSocket es un protocolo para la comunicación dúplex total sobre una única conexión TCP. WebSocket permite el intercambio de datos entre el cliente y el servidor más fácil, permitiendo que el servidor de inserción activa de datos al cliente . En la API WebSocket, el navegador y el servidor sólo tiene que completar un apretón de manos, directamente entre los dos se puede crear una conexión persistente , y la transmisión de datos bidireccional .

Django Canales WebSocket lograr la comunicación en tiempo real

Documentos oficiales

Canales es una función utilizando Django y expandir el proyecto para que no sea HTTP, para manejar el protocolo WebSocket. Se basa en la llamada ASGI la especificación de construcción Python.

A continuación, basado en el uso de los canales oficiales breves Tutorial1-2.

En primer lugar es necesario instalar Django y Canales

pip install django
pip install channels

Crea un proyecto Django y entrar en el directorio raíz del proyecto:

django-admin startproject mysite
cd mysite

A continuación, cree la raíz de enrutamiento de canales routing.py, canales de configuración similar a Django URLconf de enrutamiento, se dice Canales Cuando el servidor recibe qué código se ejecute cuando la petición HTTP.

En primer lugar, una configuración de enrutamiento vacío desde el principio, crear un archivo mysite/routing.pyque contiene el código siguiente:

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

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

A continuación, Canales biblioteca para inscribirse en la lista de aplicaciones:

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

Seguir editando mtsite/settings.pylos canales en la configuración de enrutamiento de la raíz, agregue el código siguiente:

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

Los canales pueden ser controlados en este momento runserverde comandos, en lugar de la norma desarrollada por el servidor canales servidor de desarrollo de Django.

Ejecutar el proyecto de Django:

py manage.py runserver

Verá el siguiente resultado:

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]

Se puede ver Starting ASGI/Channels development server at http://127.0.0.1:8000/, lo que indica servidor de desarrollo de canales de servidor de desarrollo de Django para hacerse cargo del proyecto. Abra la pantalla inicial , verá el pequeño cohete familiar:

Apagar el servidor, cree Aplicación event:

py manage.py startapp event

Register aplicación:

# 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',
]

En el directorio raíz crear una nueva carpeta templatesy la templates/eventcarpeta de archivos html lugar, mysite/settings.pyagregue la ruta:

# 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',
            ],
        },
    },
]

En templatesadición el archivo de vista event/list.html, en el que la plantilla WebSocket porción solicitada como sigue:

<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>

Crear una función de vista event/views.py:

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

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

Crear una ruta event/urls.py:

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

from . import views

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

Se event appañada la ruta a la ruta raíz del proyecto:

# 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')),
]

Canales de procesamiento de la solicitud:

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

Crear un consumidor (consumidor) de archivos event/consumers.py:

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

plantillas de código son los siguientes:

# 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",
        # 返回数据
    }))

Está consumers.pyconfigurado para enrutar nueva 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),
]

A continuación, los puntos de ruta de la raíz a event/routing.pyla archivo:

# 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
        )
    ),
})

Esta raíz de configuración de enrutamiento especificado cuando se establece una conexión con el desarrollo de Canales, ProtocolTypeRouterprimero será comprobar el tipo de conexión. Si se trata de la conexión WebSocket ( WS: // o WSS: // ), asignada a la conexión AuthMiddlewareStack.

En AuthMiddlewareStackla conexión de llenado de la gama para cubrir la autenticación de usuario actual y luego conectarse a URLRouter. Esto URLRouterse basa en la investigación, para proporcionar conectividad a trayectoria de la ruta HTTP a un consumidor en particular basado en urlmodelo.

Después de migrar modelo de base de datos:

py manage.py makemigrations
py manage.py migrate

Ejecutar el proyecto:

py manage.py runserver

Si se establece la conexión, el fondo debe tener la siguiente pantalla:

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]

resumen

Canales utilizan el procedimiento general anterior, la siguiente ASGI configuración, el servidor de Canales reemplazará el servidor original Django procesa la solicitud.

Sólo cuando sea necesario para el protocolo WebSocket uso para las necesidades de comunicación en tiempo real para ser configurado routing.pyy consumers.py, por el routing.pypunto de consumers.pysolicitud de procesamiento WebSocket, usando solamente las peticiones HTTP de protocolo que quedan antes del uso y no hay ninguna diferencia .

Debido a que sólo una aplicación a un proyecto en el uso de los canales, puede hacer referencia a la clave del proyecto de event.

Supongo que te gusta

Origin www.cnblogs.com/liyishan/p/12624106.html
Recomendado
Clasificación