以下に示すように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に展開する必要があります。 https
用に設定済みですが、Webソケット用ではありません。
私は答えを見つけました、runserver
コマンドはasgi.py
ファイルを正しく検出し、Djangoチャネルアプリケーションをdaphneを使用してWebSocketsで実行します。runsslserver
は同じ仕事をしていません。wsgi.py
ファイルではなくasgi.py
ファイルを実行しています。
さまざまなアプローチを読んだ後、通常の開発サーバーを使用して(つまり、wsgi.py
ファイルを使用して)HTTPS
リクエストを処理できることと、wss
を使用してDaphne
リクエストを処理できることがわかります(asgi.py
ファイルを使用して)。
Daphneは、Djangoチャネル(ツイストモジュールの上部に構築)を処理するために公式に設計されたサーバーです。
したがって、最後に、2つのサーバーを実行して、https
とwss
を別々に処理する必要があります。
# 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
テストには、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);
これで誰かの時間を節約できるといいのですが。