开始使用 Django 频道时遇到问题

Posted

技术标签:

【中文标题】开始使用 Django 频道时遇到问题【英文标题】:Trouble getting started with Django Channels 【发布时间】:2018-11-21 08:22:08 【问题描述】:

我正在创建自己的应用程序,灵感来自 Channels 2.0 tutorial。但是,我无法建立 WebSocket 连接。 Daphne 抱怨 404 说找不到 websocket URL。我不确定错误在哪里。

更新:我的 Daphne 在 nginx 服务器后面运行。 nginx 配置也更新了:

我的目录结构如下

- SomeDashboardProject
  |-- Dashboard
    |-- asgi.py
    |-- settings.py
    |-- urls.py
    |-- routing.py
    |-- ...
  |-- WebSocketTest
    |-- consumers.py
    |-- routing.py
    |-- urls.py
    |-- views.py
    |-- templates
        |-- WebSocketTest
            |-- index.html

WebSocketTest/templates/WebSocketTest/Index.html

<script type="text/javascript">
    var dashboard_id = '1';

    var chatSocket = new WebSocket('ws://' + window.location.host +
        '/ws/dboard/' + dashboard_id + '/');

    chatSocket.onmessage = function(e) 
        var data = JSON.parse(e.data);
        console.log(data);
    ;

    chatSocket.onclose = function(e) 
        console.error('Chat socket closed unexpectedly');
    ;

</script>

WebSocketTest/views.py

def index(request):
    return render(request, 'WebSocketTest/index.html', )

WebSocketTest/consumers.py

class TestConsumer(WebsocketConsumer):

    def connect(self):
        self.accept()

    def disconnect(self, close_code):
        pass

    def receive(self, text_data):
        text_data_json = json.loads(text_data)
        message = text_data_json['message']
        print(message)

WebSocketTest/routing.py

websocket_urlpatterns = [
    url(r'^ws/dboard/(?P<dashboard_id>\d+)/$', consumers.TestConsumer),
]

WebSocketTest/urls.py

urlpatterns = [
    url(r'^$', views.index, name='index'),
]

仪表板/routing.py

application = ProtocolTypeRouter(
    'websocket': AuthMiddlewareStack(
            URLRouter(
                    WebSocketTest.routing.websocket_urlpatterns
            )
    )
)

仪表板/urls.py

urlpatterns = [
    url(r'^test/', include('websockettest.urls'), name='test'),
]

达芙妮错误日志

2018-06-12 02:41:58,857 WARNING  Not Found: /ws/dboard/1/
None - - [12/Jun/2018:02:41:58] "GET /ws/dboard/1/" 404 974

Nginx.conf

upstream home 
  server unix:///Users/pranavprakash/workspace/SomeDashboardProject/nginx.sock;


# configuration of the server
server 
  # the port your site will be served on
  listen      80;
  # the domain name it will serve for
  server_name localhost; # substitute your machine's IP address or FQDN
  charset     utf-8;

  # max upload size
  client_max_body_size 75M;   # adjust to taste

  # Django media
  location /media  
    alias /Users/pranavprakash/workspace/SomeDashboardProject/media;
  

  location /static 
    alias /Users/pranavprakash/workspace/SomeDashboardProject/staticfiles;
  

  # Finally, send all non-media requests to the Django server.
  location / 
    uwsgi_pass  home;
    include     /Users/pranavprakash/workspace/SomeDashboardProject/uwsgi_params;
  

【问题讨论】:

【参考方案1】:

经过一番搜索,我发现这是 Nginx 配置的问题。我发布的 nginx 配置不允许 websockets。需要进行以下更改:

location / 
    uwsgi_pass  home;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "Upgrade";
    include     /Users/pranavprakash/workspace/SomeDashboardProject/uwsgi_params;
  

更多详情请访问Nginx blog post

【讨论】:

以上是关于开始使用 Django 频道时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章

Django Channels - 当组成员时无法直接向频道发送消息

使用没有视图的 Django 频道

IOS safari 和 Chrome 阻止了我的 websocket django 频道

Django 频道:消息在一个频道中重复

使用 SSL 使用 Daphne + NGINX 部署 Django 通道

YouTube API V3 在根据特定国家/地区获取热门频道时遇到困难