web-dev-qa-db-fra.com

Django canaux utilisant une connexion WebSocket sécurisée - WSS: //

Lorsque j'ai essayé d'exécuter l'application Django en utilisant sslserver comme indiqué ci-dessous,

python manage.py runsslserver

Erreurs:

Traceback:

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

Console du navigateur:

(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

Code:

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

Ça marche bien avec python manage.py runserver commande, signifie pour http que cela fonctionne mais pas avec https.

Comment résoudre ce problème? (Comment déboguer pour résoudre ce problème?)

Existe-t-il un autre moyen de déployer WebSockets sur le portail https?

Toujours confronté à ce problème. quelqu'un peut-il aider s'il vous plait?

Quoi qu'il en soit, c'est à des fins de test, enfin, je dois le déployer sur Apache2.4 sur la machine du serveur Windows. Où j'ai déjà configuré pour https mais pas pour les sockets web.

8
shaik moeed

J'ai trouvé la réponse, la commande runserver détecte correctement asgi.py fichier et exécutez l'application Django canaux sur WebSockets en utilisant daphné. D'une certaine manière runsslserver ne fait pas le même travail, il exécute le wsgi.py fichier au lieu de asgi.py fichier.

Après avoir lu différentes approches, j'apprends que nous pouvons gérer les requêtes HTTPS en utilisant notre serveur de développement normal (c'est-à-dire en utilisant wsgi.py file) et wss request en utilisant Daphne (c'est-à-dire en utilisant asgi.py fichier).

Daphne était un serveur officiellement conçu pour gérer les canaux Django (construit sur le dessus du module torsadé).

Donc, enfin, nous devons exécuter deux serveurs pour gérer https et wss séparément.

# In command Prompt 1
python manage.py runsslserver 0.0.0.0:8000

# In command Prompt 2
daphne -e ssl:8001:privateKey=cert\\private.pem:certKey=cert\\public.pem real_time_table.asgi:application

Nous pouvons utiliser les mêmes certificats SSL utilisés par runsslserver pour les tests.

Enfin, 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);

J'espère que cela fera gagner du temps à quelqu'un.

1
shaik moeed