安全なWebSocket接続を使用したDjangoチャネル-WSS://


8

sslserver以下のようにDjangoアプリケーションを実行しようとすると、

python manage.py runsslserver

エラー:

トレースバック:

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

ブラウザコンソール:

(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

コード:

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

これは、と罰金を働いているpython manage.py runserverための手段、コマンドhttpそれの作業ではなく、とhttps

この問題を解決するには?(この問題を解決するためにデバッグする方法は?)

httpsポータルにWebSocketをデプロイする方法は他にありますか?

まだこの問題に直面しています。誰か助けてくれますか?

とにかく、これはテストを目的としています。最後に、WindowsサーバーマシンのApache2.4に展開する必要があります。httpsWebソケット用ではなく、すでに設定済みの場合。


1
それは言う/ WS /家を:見つかりませんでした。httpでも同じですか?
例:

2
いいえ、正常に機能しています。に問題はありませんhttp
shaik moeed

1
@shaikmoeed settings.pyでCHANNEL_LAYERSを構成したかどうかを確認してください
wowkin2

1
@ wowkin2 CHANNEL_LAYERSが設定され、で完全に機能しhttpます。実行する方法https
shaik moeed

2
@shaikmoeedそのためダフネを使おうとしましたか?そうでない場合-本当にそうすることをお勧めします:github.com/django/daphne
wowkin2

回答:


4

私は答えを見つけました、runserverコマンドはasgi.pyファイルを正しく検出し、daphneを使用してWebSocketでDjangoチャネルアプリケーションを実行します。どういうわけかrunsslserver同じ仕事をしていない、それはwsgi.pyファイルの代わりにasgi.pyファイルを実行しています。

さまざまなアプローチを読んだ後HTTPS、通常の開発サーバーを使用して(つまり、ファイルを使用してwsgi.pywss要求を処理し、使用してDaphne(つまり、asgi.pyファイルを使用して)要求を処理できることがわかります。

Daphneは、django-channels(ツイストモジュールの上部に構築)を処理するために公式に設計されたサーバーです。

したがって、最後に、2つのサーバーを処理httpsしてwss別々に実行する必要があります。

# 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

runsslserverテストに使用したものと同じSSL証明書を使用できます。

最後に、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);

これで誰かの時間を節約できるといいのですが。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.