Canais do Django usando conexão WebSocket segura - WSS: //

8

Quando tentei executar o aplicativo Django usando sslservercomo mostrado abaixo,

python manage.py runsslserver

Erros:

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

Está funcionando bem com o python manage.py runservercomando, significa httpque está funcionando, mas não com https.

Como resolver esse problema? (Como depurar para resolver esse problema?)

Existe alguma outra maneira de implantar o WebSockets no httpsportal?

Ainda enfrentando esse problema. Alguém por favor pode ajudar?

De qualquer forma, isso é para fins de teste; finalmente, preciso implantá-lo no Apache2.4 na máquina do servidor Windows. Onde eu já configurei, httpsmas não para soquetes da web.

shaik moeed
fonte
1
Diz Não encontrado: / ws / home . Diz o mesmo para o http?
Egeu
2
Não, está funcionando corretamente. Não há nenhum problema com http.
shaik moeed
1
@shaikmoeed Verifique se você configurou CHANNEL_LAYERS em settings.py #
wowkin2
1
O @ wowkin2 CHANNEL_LAYERSfoi configurado e está funcionando perfeitamente http. Como correr https?
shaik moeed
2
@shaikmoeed você já tentou usar o Daphne para isso? Se não - realmente recomendo fazer isso: github.com/django/daphne
wowkin2

Respostas:

4

Encontrei a resposta, o runservercomando detecta corretamente o asgi.pyarquivo e executa o aplicativo de canais do Django no WebSockets usando daphne. De alguma forma, runsslservernão está fazendo o mesmo trabalho, está executando o wsgi.pyarquivo em vez de o asgi.pyarquivo.

Depois de ler abordagens diferentes, eu sei que podemos lidar com HTTPSsolicitações usando nosso servidor de desenvolvimento normal (ou seja, usando wsgi.pyarquivo) e wsssolicitações usando Daphne(ou seja, usando asgi.pyarquivo).

Daphne foi um servidor oficialmente projetado para lidar com canais django (construído na parte superior do módulo trançado).

Então, finalmente, precisamos executar dois servidores para manipular httpse wssseparadamente.

# 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 os mesmos certificados SSL usados ​​pelos runsslservertestes.

Por fim, em 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 isso economize o tempo de alguém.

shaik moeed
fonte