Saltear al contenido principal

WebSockets – Lenguaje Python

Un WebSocket es un protocolo estándar para la transferencia de datos bidireccional entre un cliente y un servidor. El protocolo WebSockets no se ejecuta a través de HTTP, sino que es una implementación separada además de
TCP.

Contrata a un experto en Python para iniciar tu proyecto hoy mismo:

¿Por qué utilizar WebSockets?

Una conexión WebSocket permite la comunicación full-duplex entre un cliente y un servidor para que ambos lados puedan enviar datos al otro a través de una conexión establecida. La razón por la que WebSockets, junto con las tecnologías relacionadas de Eventos enviados por el servidor (SSE) y Canales de datos WebRTC, son importantes es que HTTP no está diseñado para mantener abierta una conexión para que el servidor envíe datos con frecuencia a un navegador web. Anteriormente, la mayoría de las aplicaciones web implementaban un sondeo largo a través de solicitudes frecuentes de JavaScript y XML asincrónico (AJAX), como se muestra en el siguiente diagrama.

El sondeo largo a través de AJAX es increíblemente ineficaz para algunas aplicaciones.

La inserción del servidor es más eficiente y escalable que el sondeo prolongado porque el navegador web no tiene que solicitar actualizaciones constantemente a través de un flujo de solicitudes AJAX.

Los WebSockets son más eficientes que el sondeo largo para las actualizaciones enviadas por el servidor.

Si bien el diagrama anterior muestra un servidor que envía datos al cliente, WebSockets es una conexión full-duplex, por lo que el cliente también puede enviar datos al servidor como se muestra en el diagrama siguiente.

WebSockets también permite la inserción del cliente además de las actualizaciones enviadas por el servidor.

El enfoque de WebSockets para actualizaciones impulsadas por el servidor y el cliente funciona bien para ciertas categorías de aplicaciones web, como la sala de chat, por lo que suele ser una aplicación de ejemplo para una biblioteca WebSocket.

Implementación de WebSockets

Tanto el navegador web como el servidor deben implementar el protocolo WebSockets para establecer y mantener la conexión. Hay implicaciones importantes para los servidores, ya que las conexiones WebSockets son de larga duración, a diferencia de las conexiones HTTP típicas.

Un servidor multiproceso o multiproceso no se puede escalar adecuadamente para WebSockets porque está diseñado para abrir una conexión, manejar una solicitud lo más rápido posible y luego cerrar la conexión. Un servidor asincrónico como Tornado o Unicornio verde mono parcheado con gevent es necesario para cualquier implementación práctica de WebSockets en el lado del servidor.

En el lado del cliente, no es necesario utilizar una biblioteca JavaScript para WebSockets. Los navegadores web que implementan WebSockets expondrán toda la funcionalidad necesaria del lado del cliente a través del Objeto WebSockets.

Sin embargo, una biblioteca contenedora de JavaScript puede facilitar la vida de un desarrollador implementando una degradación elegante (a menudo recurriendo al sondeo largo cuando los WebSockets no son compatibles) y proporcionando una envoltura alrededor de las peculiaridades de WebSocket específicas del navegador. En una sección a continuación se muestran ejemplos de bibliotecas cliente de JavaScript e implementaciones de Python.

Proxying de Nginx WebSocket

Nginx admite oficialmente el proxy WebSocket a partir de
versión 1.3. Sin embargo, debe configurar los encabezados de actualización y conexión para asegurarse de que las solicitudes pasen a través de Nginx a su servidor WSGI. Puede ser complicado configurar esto la primera vez.

Aquí están los ajustes de configuración que utilizo en mi archivo Nginx como parte de mi proxy WebSockets.

# this is where my WSGI server sits answering only on localhost
# usually this is Gunicorn monkey patched with gevent
upstream app_server_wsgiapp {
  server localhost:5000 fail_timeout=0;
}

server {

  # typical web server configuration goes here

  # this section is specific to the WebSockets proxying
  location /socket.io {
    proxy_pass http://app_server_wsgiapp/socket.io;
    proxy_redirect off;

    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_read_timeout 600;
  }
}

Tenga en cuenta que si tiene algún problema con la configuración de ejemplo anterior, querrá ampliar el documentación oficial del módulo proxy HTTP.

Los siguientes recursos también son útiles para configurar la configuración correctamente.

Implementaciones de Python WebSockets

Los siguientes proyectos implementan WebSockets en Python o proporcionan un código de ejemplo que puede seguir para usar WebSockets en sus propios proyectos.

  • Autobahn utiliza Twisted y asyncio para crear el componente WebSockets del lado del servidor mientras
    AutobahnJS asiste en el lado del navegador web del cliente.
  • Canales de Django está construido sobre WebSockets y es fácil de integrar con proyectos Django nuevos o existentes.
  • Matraz-SocketIO es una extensión de Flask que se basa en eventlet o gevent para crear conexiones WebSockets del lado del servidor.
  • cliente websocket
    proporciona API de bajo nivel para WebSockets y funciona con Python 2 y 3.
  • Crossbar.io se basa en Autobahn e incluye un servidor separado para manejar las conexiones WebSockets si lo desea el desarrollador de la aplicación web.

Bibliotecas cliente de JavaScript

JavaScript se utiliza para crear el lado del cliente de la conexión WebSocket porque el cliente suele ser un navegador web. Si bien no necesita una de estas bibliotecas del lado del cliente para usar WebSockets, son útiles para minimizar la cantidad de código repetitivo para establecer y manejar sus conexiones.

  • Socket.ioLa biblioteca de JavaScript del lado del cliente se puede utilizar para conectarse a una implementación de WebSockets del lado del servidor.
  • web-socket-js es una implementación de WebSockets del lado del cliente basada en Flash.
  • AutobahnJS asiste en el lado del navegador web del cliente.

Código de ejemplo para WebSockets en Python

Existen numerosas implementaciones basadas en Python para WebSockets, por lo que a veces es más fácil examinar un ejemplo para que pueda construir algo para su propio proyecto.

Recursos de WebSockets específicos de Python

Recursos generales de WebSockets

WebSockets tiene un amplio soporte de navegador y, por lo tanto, muchos marcos web en todos los principales lenguajes de programación tienen bibliotecas para facilitar la creación de conexiones WebSockets. Los siguientes recursos son guías generales y tutoriales que brindan un contexto para el protocolo sin entrar en la maleza de cómo usar WebSockets en Python.

¿Qué sigue para su aplicación web?

¿Necesitas ayuda para revisar el código de tu proyecto?



Esta entrada tiene 0 comentarios

Deja una respuesta

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

Volver arriba