Django daphne asgi:Django只能处理ASGI / HTTP连接,而不能处理websocket

这确实令人沮丧,我确实按照文档进行了所有设置,但是当我尝试独立运行daphne时,它总是抛出错误,当我使用python manage.py run server时,它可以正常工作。这非常令人沮丧,我似乎在其他任何地方都找不到类似的错误

2020-01-25 09:57:17,627 INFO     Starting server at tcp:port=8000:interface=127.0.0.1
2020-01-25 09:57:17,628 INFO     HTTP/2 support not enabled (install the http2 and tls Twisted extras)
2020-01-25 09:57:17,628 INFO     Configuring endpoint tcp:port=8000:interface=127.0.0.1
2020-01-25 09:57:17,629 INFO     Listening on TCP address 127.0.0.1:8000
127.0.0.1:44516 - - [25/Jan/2020:09:57:27] "WSCONNECTING /ws/score/" - -
2020-01-25 09:57:28,637 ERROR    Exception inside application: Django can only handle ASGI/HTTP connections,not websocket.
  File "/home/sofdeath/.local/lib/python3.7/site-packages/daphne/cli.py",line 30,in asgi
    await self.app(scope,receive,send)
  File "/home/sofdeath/.local/lib/python3.7/site-packages/django/core/handlers/asgi.py",line 146,in __call__
    % scope['type']
  Django can only handle ASGI/HTTP connections,not websocket.
127.0.0.1:44516 - - [25/Jan/2020:09:57:28] "WSDISCONNECT /ws/score/" - -
^C2020-01-25 09:57:39,126 INFO     Killed 0 pending application instances

这是我的asgi.py

import os

from django.core.asgi import get_asgi_application

os.environ.setdefault('DJANGO_SETTINGS_MODULE','tabulator.settings')

application = get_asgi_application()

我的routing.py:

from django.urls import re_path
from channels.auth import AuthMiddlewareStack
from channels.routing import ProtocolTypeRouter,URLRouter
from channels.security.websocket import AllowedHostsoriginValidator,OriginValidator
import judge.routing

application = ProtocolTypeRouter({
    # (http->django views is added by default)
    'websocket': AllowedHostsoriginValidator(
        AuthMiddlewareStack(
            URLRouter(
                judge.routing.websocket_urlpatterns
            )
        )
    ),})

并在我的settings.py中:

INSTALLED_APPS = [
    ...
    'channels',]
...
WSGI_APPLICATION = 'tabulator.wsgi.application'
ASGI_APPLICATION = "tabulator.routing.application"
...
CHANNEL_LAYERS = {
    "default": {
        'BACKEND': 'channels_redis.core.RedisChannelLayer','CONFIG': {
            "hosts": [('127.0.0.1',6379)],},}

ether1984 回答:Django daphne asgi:Django只能处理ASGI / HTTP连接,而不能处理websocket

将您的asgi.py更改为此:

import os
import django
from channels.routing import get_default_application

os.environ.setdefault('DJANGO_SETTINGS_MODULE','tabulator.settings')

django.setup()

application = get_default_application()
,

按照@ahmad的说法更改您的ROCKET_DATABASES={my_db={url="postgres://user:pass@localhost/my_db"}},然后将您的asgi.py编辑为:

settings.py

,并确保CHANNEL_LAYERS = { "default": { 'BACKEND': 'channels_redis.core.RedisChannelLayer','CONFIG': { "hosts": [("redis",6379)],},} 。那是因为您没有在本地服务器上运行项目,如果您使用DEBUG = False"127.0.0.1",它将引发错误。

本文链接:https://www.f2er.com/2714101.html

大家都在问