Django频道:URLRouter不能将列表作为参数

问题描述 投票:1回答:1

我正在研究一个项目,要求我使用2个WebSocket和2个不同Apps中的2个不同使用者使用,但是当我尝试使用列表提供URLRouter时,它说该列表没有属性'callback'

from channels.routing import ProtocolTypeRouter, URLRouter
from channels.auth import AuthMiddlewareStack
import chat_app.routing, startupapp.routing

application = ProtocolTypeRouter({
      'websocket': AuthMiddlewareStack(
          URLRouter([
             chat_app.routing.websocket_urlpatterns,
             startupapp.routing.websocket_urlpatterns
     ])
   )
})

是否有解决方案或任何其他方法可以实现相同目标?

这里是错误:

Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).
June 12, 2020 - 12:01:11
Django version 3.0.6, using settings 'StartupIo.settings'
Starting ASGI/Channels version 2.4.0 development server at 
http://127.0.0.1:8000
/
Quit the server with CTRL-BREAK.
Exception in thread django-main-thread:
Traceback (most recent call last):
  File "C:\Program Files (x86)\Python37-32\lib\threading.py", line 926, in 
_boot
strap_inner
    self.run()
File "C:\Program Files (x86)\Python37-32\lib\threading.py", line 870, in 
run
self._target(*self._args, **self._kwargs)
File "C:\Users\MaaRooF Khan\Desktop\StartupIoEnv\lib\site- 
packages\django\util
s\autoreload.py", line 53, in wrapper
fn(*args, **kwargs)
File "C:\Users\MaaRooF Khan\Desktop\StartupIoEnv\lib\site- 
packages\channels\ma
nagement\commands\runserver.py", line 101, in inner_run
application=self.get_application(options),
File "C:\Users\MaaRooF Khan\Desktop\StartupIoEnv\lib\site- 
packages\channels\ma
nagement\commands\runserver.py", line 126, in get_application
return StaticFilesWrapper(get_default_application())
File "C:\Users\MaaRooF Khan\Desktop\StartupIoEnv\lib\site- 
packages\channels\ro
uting.py", line 29, in get_default_application
module = importlib.import_module(path)
File "C:\Program Files (x86)\Python37-32\lib\importlib\__init__.py", line 
127,
in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 1006, in _gcd_import
File "<frozen importlib._bootstrap>", line 983, in _find_and_load
File "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 677, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 728, in exec_module
File "<frozen importlib._bootstrap>", line 219, in 
_call_with_frames_removed
File "C:\Users\MaaRooF 
Khan\Desktop\StartupIoEnv\Scripts\StartupIo\StartupIo\r
outing.py", line 9, in <module>
startupapp.routing.websocket_urlpatterns
File "C:\Users\MaaRooF Khan\Desktop\StartupIoEnv\lib\site- 
packages\channels\ro
uting.py", line 113, in __init__
if not route.callback and isinstance(route, URLResolver):
AttributeError: 'list' object has no attribute 'callback'
python django django-channels channels
1个回答
0
投票

我得到了解决方案。这样做不是为两个应用程序都创建单独的routing.py,而是这样做:

from channels.routing import ProtocolTypeRouter, URLRouter
from channels.auth import AuthMiddlewareStack
import app1.consumers, app2.consumers
from django.urls import re_path

application = ProtocolTypeRouter({
    'websocket': AuthMiddlewareStack(
        URLRouter([
            re_path(r'ws/chat/(?P<room_name>\w+)/$', app1.consumers.App1Consumer),
            re_path(r'ws/run/$', app2.consumers.App2Consumer)
        ])
    )
})
© www.soinside.com 2019 - 2024. All rights reserved.