Canales de Django que usan conexión segura WebSocket - WSS: //

8

Cuando intenté ejecutar la aplicación Django usando sslservercomo se muestra a continuación,

python manage.py runsslserver

Errores:

Rastrear:

Validating models...

System check identified no issues (0 silenced).
November 08, 2019 - 11:17:26
Django version 2.0.7, using settings 'dashboard_channels.settings'
Starting development server at https://127.0.0.1:8000/
Using SSL certificate: \lib\site-packages\sslserver\certs\development.crt
Using SSL key: \lib\site-packages\sslserver\certs\development.key
Quit the server with CTRL-BREAK.
[08/Nov/2019 11:18:33] "GET / HTTP/1.1" 200 1299
[08/Nov/2019 11:18:34] "GET / HTTP/1.1" 200 1299
[08/Nov/2019 11:18:35] "GET /static/js/jquery.js HTTP/1.1" 200 270575
Not Found: /ws/home
[08/Nov/2019 11:18:36] "GET /ws/home HTTP/1.1" 404 2134

Consola del navegador:

(index):31 WebSocket connection to 'wss://127.0.0.1:8000/ws/home' failed: Error during WebSocket handshake: Unexpected response code: 404
(index):41 error Event
(index):44 close CloseEvent

Código:

Javascript:

 var loc = window.location;
 var wsStart = 'ws://';
 if (loc.protocol == 'https:') {
     wsStart = 'wss://'
 }
 var endpoint = wsStart + loc.host + '/ws/home';

 var socket = new WebSocket(endpoint);

Funciona bien con el python manage.py runservercomando, significa httpque funciona pero no con https.

Cómo resolver este problema? (¿Cómo depurar para solucionar este problema?)

¿Hay alguna otra forma de implementar WebSockets en el httpsportal?

Todavía enfrenta este problema. Alguien puede ayudarme porfavor?

De todos modos, esto es para fines de prueba, finalmente, necesito implementarlo en Apache2.4 en la máquina del servidor de Windows. Donde ya lo configuré httpspero no para los sockets web.

shaik moeed
fuente
1
Dice No encontrado: / ws / home . ¿Dice lo mismo para http?
ege
2
No, está funcionando correctamente. No hay problema con http.
Shaik Moeed
1
@shaikmoeed Compruebe si configuró CHANNEL_LAYERS en settings.py
wowkin2
1
@ wowkin2 CHANNEL_LAYERSse configuró y funciona totalmente bien con http. ¿Cómo correr https?
Shaik Moeed
2
@shaikmoeed, ¿has intentado usar Daphne para eso? Si no, realmente recomiendo hacerlo: github.com/django/daphne
wowkin2

Respuestas:

4

Encontré la respuesta, el runservercomando detecta correctamente el asgi.pyarchivo y ejecuta la aplicación de canales Django en WebSockets usando daphne. De alguna manera runsslserverno está haciendo el mismo trabajo, está ejecutando el wsgi.pyarchivo en lugar del asgi.pyarchivo.

Después de leer diferentes enfoques, sé que podemos manejar la HTTPSsolicitud utilizando nuestro servidor de desarrollo normal (es decir, usando un wsgi.pyarchivo) y la wsssolicitud usando Daphne(es decir, usando un asgi.pyarchivo).

Daphne era un servidor oficialmente diseñado para manejar canales django (construido en la parte superior del módulo retorcido).

Entonces, finalmente, necesitamos ejecutar dos servidores para manejar httpsy por wssseparado.

# In command prompt 1 (For production, use Apache or Nginx to serve HTTP requests)
python manage.py runsslserver 0.0.0.0:8000

# In command prompt 2 (This works for production as well).
daphne -e ssl:8001:privateKey=cert\\private.pem:certKey=cert\\public.pem real_time_table.asgi:application

Podemos usar los mismos certificados SSL utilizados runsslserverpara las pruebas.

Finalmente, en JavaScript:

var loc = window.location;
var wsStart = 'ws://';
if (loc.protocol == 'https:') {
     wsStart = 'wss://'
}
// var endpoint = wsStart + 'your_ip_address:port_given_to_daphne_server' + '/ws/home';
// For above command, it look like this
var endpoint = wsStart + 'xxx.xx.xx.xxx:8001' + '/ws/home';
// Note the websocket port is 8001
var socket = new WebSocket(endpoint);

Espero que esto ahorre tiempo a alguien.

shaik moeed
fuente