Canales de Django – Introducción y configuración básica

Django es un poderoso framework de Python para el desarrollo web. Es rápido, seguro y confiable. Los canales permiten que los proyectos de Django manejen HTTP junto con protocolos asíncronos como WebSockets, MQTT, chatbots y más. 

Canales:

Los canales preservan el comportamiento síncrono de Django y agregan una capa de protocolos asíncronos que permiten a los usuarios escribir las vistas que son completamente síncronas, asíncronas o una combinación de ambas. Básicamente, los canales permiten que la aplicación admita «conexiones de larga duración». Reemplaza el WSGI predeterminado de Django con su ASGI .

ASGI:

ASGI (Interfaz de puerta de enlace de servidor asíncrono) proporciona una interfaz entre aplicaciones y servidores web Python asíncronos mientras admite todas las características proporcionadas por WSGI.

Consumidores:

Un consumidor es una unidad básica de Canales. Es una clase basada en eventos que admite aplicaciones asíncronas y sincronizadas. Los consumidores pueden ejecutar más tiempo y, por lo tanto, admiten sockets web que necesitan una conexión persistente.

En esta publicación, configuraremos un ejemplo básico de canales. Construiremos una aplicación de calculadora que permitirá al usuario enviar múltiples expresiones al servidor y recibir el resultado a través de una única conexión persistente.

Configuración del entorno:

  • Siempre es una buena idea crear un entorno virtual para las aplicaciones de Python para evitar conflictos de versiones. Ejecute los siguientes comandos en la terminal para comenzar
easy-install pip
python3 -m pip install virtualenv
virtualenv venv
source venv/bin/activate
  • Ahora instala Django y Canales :
pip install django
pip install channels
# On windows, try an unofficial wheel of 'Twisted' in case of dependency errors

Aplicación LiveCalculator:

Ahora inicie un proyecto Django y cree una aplicación llamada ‘liveCalculator’

django-admin startproject sampleProject
cd sampleProject
python3 manage.py startapp liveCalculator

En sampleProject/settings.py , registre canales y liveCalculator .

configuración.py:

INSTALLED_APPS = [
   'channels',
   'liveCalculator',
   'django.contrib.admin',
   'django.contrib.auth',
   'django.contrib.contenttypes',
   'django.contrib.sessions',
   'django.contrib.messages',
   'django.contrib.staticfiles',
]

En sampleProject/asgi.py, agregue el protocolo http.

asgi.py:

Python3

import os
  
import django
from channels.http import AsgiHandler
from channels.routing import ProtocolTypeRouter
  
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'sampleProject.settings')
django.setup()
  
application = ProtocolTypeRouter({
  "http": AsgiHandler(),
  # Just HTTP for now. (We can add other protocols later.)
})

Ahora necesitamos registrar este asgi en nuestra aplicación. Agregue esta línea en sampleProject/settings.py:

ASGI_APPLICATION = "sampleProject.asgi.application"

Cree una nueva carpeta liveCalculator/templates/liveCalculator y cree un nuevo archivo index.html dentro de ella. Será la página de inicio de nuestra aplicación. Agregue el siguiente código en index.html:

índice.html:

HTML

<!DOCTYPE html>
<html lang="en">
  
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Live Calculator</title>
</head>
  
<body>
    <textarea name="ta" id="results" cols="30" rows="10">
  
    </textarea><br>
    Enter the expression: <input type="text" id="exp">
    <input type="button" id="submit" value="Get Results">
    <script>
        const socket = new WebSocket('ws://localhost:8000/ws/livec/');
        socket.onmessage = (e) => {
            result = JSON.parse(e.data).result;
            document.getElementById("results").value += "Server: " + result + "\n";
        }
  
        socket.onclose = (e) => {
            console.log("Socket closed!");
        }
  
        document.querySelector('#exp').onkeyup = function (e) {
            if (e.keyCode === 13) {  // enter, return
                document.querySelector('#submit ').click();
            }
        };
  
        document.querySelector("#submit").onclick = (e) => {
            inputfield = document.querySelector("#exp")
            exp = inputfield.value
            socket.send(JSON.stringify(
                {
                    expression: exp
                }
            ))
            document.querySelector("#results").value += "You: " + exp + "\n";
            inputfield.value = "";
        }
  
    </script>
</body>
  
</html>

El código anterior generará un área de texto y un cuadro de entrada donde el usuario puede ingresar la expresión. Creará una conexión de socket que haremos más tarde y agregará el resultado recibido en el área de texto. Cuando el usuario ingrese la expresión, enviará la expresión a través de una conexión de socket.

Ahora cree una vista para representar esta página en liveCalculator/views.py :

calculadora en vivo/vistas.py:

Python3

from django.shortcuts import render
  
# Create your views here.
  
def index(request):
    return render(request, 'liveCalculator/index.html', {})

A continuación, necesitamos crear una ruta para esta vista. Agregue un nuevo archivo urls.py en el directorio liveCalculator y agregue el siguiente código:

liveCalculator/urls.py:

Python3

from django.conf.urls import url
from . import views
  
urlpatterns = [
    url(r'^$', views.index, name="index"),
]

Registre esta ruta en sampleProject/urls.py :

ejemploProyecto/urls.py:

Python3

from django.contrib import admin
from django.urls import path
from django.conf.urls import include, url
urlpatterns = [
    path('admin/', admin.site.urls),
    url(r'^', include('liveCalculator.urls'))
]

Ahora necesitamos crear el consumidor para nuestra conexión de socket web. Usaremos la clase genérica WebsocketConsumer para implementar sus métodos basados ​​en eventos. Cree un nuevo archivo consumer.py en la carpeta liveCalculator y agregue el siguiente código:

consumidores.py:

Python3

import json
from channels.generic.websocket import WebsocketConsumer
  
class Calculator(WebsocketConsumer):
    def connect(self):
        self.accept()
  
    def disconnect(self, close_code):
        self.close()   
  
    def receive(self, text_data):
        text_data_json = json.loads(text_data)
        expression = text_data_json['expression']
        try:
            result = eval(expression)
        except Exception as e:
            result = "Invalid Expression"
        self.send(text_data=json.dumps({
            'result': result
        }))

La clase WebsocketConsumer admite estos métodos definidos por el usuario:

  • connect() : Podemos escribir la lógica comercial de lo que debería suceder cuando el cliente envía una solicitud de conexión.
  • desconectar() : podemos escribir la lógica comercial de lo que debería suceder cuando el cliente envía una solicitud de desconexión.
  • recibir(): podemos escribir la lógica comercial de lo que debería suceder cuando el cliente envía un mensaje.

También es compatible con estos métodos integrados:

  • accept(): Aceptará la conexión entrante.
  • close(): Cerrará la conexión actual.
  • send(): Enviará el mensaje especificado al cliente.

Simplemente hemos utilizado los métodos anteriores en nuestra clase Calculadora para aceptar la conexión, evaluar la expresión cuando se recibe un mensaje y enviarlo al cliente.

A continuación, también debemos definir el método de enrutamiento para este consumidor. Cree un nuevo archivo routing.py en la misma carpeta y agréguele el siguiente código:

enrutamiento.py:

Python3

from django.urls import re_path
  
from . import consumers
  
websocket_urlpatterns = [
    re_path(r'ws/livec/$', consumers.Calculator.as_asgi()),
]

Tenga en cuenta que hemos usado el método as_asgi() en nuestra clase Calculadora para usarlo en nuestra aplicación. Esto habilitará el socket en ws://<IP:Port>/ws/livec . Ahora registre routing.py en asgi.py declarando el protocolo  WebSocket .

asgi.py:

Python3

import os
  
from channels.auth import AuthMiddlewareStack
from channels.routing import ProtocolTypeRouter, URLRouter
from django.core.asgi import get_asgi_application
import liveCalculator.routing
  
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "sampleProject.settings")
  
application = ProtocolTypeRouter({
  "http": get_asgi_application(),
  "websocket": AuthMiddlewareStack(
        URLRouter(
            liveCalculator.routing.websocket_urlpatterns
        )
    ),
})

Casi hemos terminado con nuestra primera aplicación de Canales. Guarde todos los archivos y ejecute los siguientes comandos en la terminal:

python3 manage.py makemigrations
python3 manage.py migrate
python3 manage.py runserver

Ahora abra http://localhost:8000 en su navegador, y debería ver el resultado como este:

Ver el registro del servidor. Tenga en cuenta que hemos creado la conexión solo una vez y podemos enviar el mensaje varias veces sin crear una nueva conexión. 

Publicación traducida automáticamente

Artículo escrito por mukulbindal170299 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *