Các kênh Django sử dụng kết nối WebSocket được bảo mật - WSS: //


8

Khi tôi cố chạy ứng dụng Django bằng sslserverhình bên dưới,

python manage.py runsslserver

Lỗi:

Tìm lại:

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

Bảng điều khiển trình duyệt:

(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

Mã số:

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

Nó hoạt động tốt với python manage.py runserverlệnh, có nghĩa là httpnó hoạt động nhưng không hoạt động https.

Làm thế nào để giải quyết vấn đề này? (Làm thế nào để gỡ lỗi để sắp xếp vấn đề này?)

Có cách nào khác để triển khai WebSockets trên httpscổng thông tin không?

Vẫn phải đối mặt với vấn đề này. Có ai giúp đuợc không?

Dù sao đây là mục đích thử nghiệm, cuối cùng, tôi cần triển khai nó trên Apache2.4 trong máy chủ windows. Nơi tôi đã thiết lập httpsnhưng không phải cho ổ cắm web.


1
Nó nói Không tìm thấy: / ws / home . Nó có nói như vậy cho http không?
ege

2
Không, nó hoạt động đúng. Không có vấn đề với http.
shaik moeed

1
@shaikmoeed Vui lòng kiểm tra xem bạn đã định cấu hình CHANNEL_LAYERS trong settings.py
wowkin2

1
@ wowkin2 CHANNEL_LAYERSđã được cấu hình và nó hoạt động hoàn toàn tốt http. Làm thế nào để chạy trên https?
shaik moeed

2
@shaikmoeed bạn đã thử sử dụng Daphne cho điều đó chưa? Nếu không - thực sự khuyên bạn nên làm điều đó: github.com/django/daphne
wowkin2

Câu trả lời:


4

Tôi tìm thấy câu trả lời, runserverlệnh phát hiện chính xác asgi.pytệp và chạy ứng dụng kênh Django trên WebSockets bằng daphne. Bằng cách nào đó runsslserverkhông làm cùng một công việc, Nó đang chạy wsgi.pytệp thay vìasgi.py tệp.

Sau khi đọc các cách tiếp cận khác nhau, tôi biết rằng chúng ta có thể xử lý HTTPSyêu cầu bằng cách sử dụng máy chủ phát triển bình thường (nghĩa là sử dụng wsgi.pytệp) và wssyêu cầu bằng cách sử dụng Daphne(tức là sử dụng asgi.pytệp).

Daphne là một máy chủ được thiết kế chính thức để xử lý các kênh django (được xây dựng trên đỉnh của mô-đun xoắn).

Vì vậy, cuối cùng, chúng ta cần chạy hai máy chủ để xử lý httpswssriêng biệt.

# 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

Chúng tôi có thể sử dụng cùng một chứng chỉ SSL được sử dụng runsslserverđể thử nghiệm.

Cuối cùng, bằng 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);

Tôi hy vọng, điều này sẽ tiết kiệm thời gian của ai đó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.