Django-Kanäle mit gesicherter WebSocket-Verbindung - WSS: //

8

Als ich versuchte, die Django-Anwendung sslserverwie unten gezeigt auszuführen ,

python manage.py runsslserver

Fehler:

Zurück verfolgen:

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

Browserkonsole:

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

Es funktioniert gut mit python manage.py runserverBefehl, bedeutet, dass httpes funktioniert, aber nicht mit https.

Wie kann ich dieses Problem beheben? (Wie kann ich debuggen, um dieses Problem zu beheben?)

Gibt es eine andere Möglichkeit, WebSockets im httpsPortal bereitzustellen ?

Immer noch vor diesem Problem. Kann mir bitte jemand helfen?

Wie auch immer, dies dient zu Testzwecken. Schließlich muss ich es auf Apache2.4 auf dem Windows Server-Computer bereitstellen. Wo ich mich schon eingerichtet habe, httpsaber nicht für Web-Sockets.

Shaik Moeed
quelle
1
Es heißt Nicht gefunden: / ws / home . Sagt es dasselbe für http?
Ege
2
Nein, es funktioniert richtig. Es gibt kein Problem mit http.
Shaik Moeed
1
@shaikmoeed Bitte überprüfen Sie, ob Sie CHANNEL_LAYERS in settings.py
wowkin2
1
@ wowkin2 CHANNEL_LAYERSwurde konfiguriert und es funktioniert völlig gut mit http. Wie läuft man weiter https?
Shaik Moeed
2
@shaikmoeed hast du versucht, Daphne dafür zu verwenden? Wenn nicht - wirklich zu empfehlen: github.com/django/daphne
wowkin2

Antworten:

4

Ich fand die Antwort, der runserverBefehl erkennt die asgi.pyDatei korrekt und führt die Django-Kanalanwendung auf WebSockets mit daphne aus. Irgendwie macht runsslserveres nicht den gleichen Job, es führt die wsgi.pyDatei anstelle der asgi.pyDatei aus.

Nachdem ich verschiedene Ansätze gelesen habe, erfahre ich, dass wir HTTPSAnfragen mit unserem normalen Entwicklungsserver (dh mit wsgi.pyDatei) und wssAnfragen mit Daphne(dh mit asgi.pyDatei) bearbeiten können .

Daphne war ein offiziell entwickelter Server für Django-Kanäle (auf der Oberseite des verdrillten Moduls aufgebaut).

Schließlich müssen wir zwei Server ausführen, um sie getrennt httpsund wssgetrennt zu handhaben .

# 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

Wir können dieselben SSL-Zertifikate verwenden, die auch runsslserverzum Testen verwendet werden.

Schließlich in 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);

Ich hoffe, das spart jemandem Zeit.

Shaik Moeed
quelle