我已经用 Django 为 WebSocket 完成了本教程但是当我执行“python manage.py runserver”时我遇到了这个问题:
HTTP GET /chat/hello/ 200 [0.01, 127.0.0.1:65009]
WebSocket HANDSHAKING /ws/chat/hello/ [127.0.0.1:65014]
Exception inside application: 'int' object has no attribute 'decode'
Traceback (most recent call last):
File "D:\Projects\New Backend\venv\lib\site-packages\django\contrib\staticfiles\handlers.py", line 101, in __call__
return await self.application(scope, receive, send)
File "D:\Projects\New Backend\venv\lib\site-packages\channels\routing.py", line 62, in __call__
return await application(scope, receive, send)
File "D:\Projects\New Backend\venv\lib\site-packages\channels\sessions.py", line 47, in __call__
return await self.inner(dict(scope, cookies=cookies), receive, send)
File "D:\Projects\New Backend\venv\lib\site-packages\channels\sessions.py", line 263, in __call__
return await self.inner(wrapper.scope, receive, wrapper.send)
File "D:\Projects\New Backend\venv\lib\site-packages\channels\auth.py", line 185, in __call__
return await super().__call__(scope, receive, send)
File "D:\Projects\New Backend\venv\lib\site-packages\channels\middleware.py", line 24, in __call__
return await self.inner(scope, receive, send)
File "D:\Projects\New Backend\venv\lib\site-packages\channels\routing.py", line 116, in __call__
return await application(
File "D:\Projects\New Backend\venv\lib\site-packages\channels\consumer.py", line 94, in app
return await consumer(scope, receive, send)
File "D:\Projects\New Backend\venv\lib\site-packages\channels\consumer.py", line 58, in __call__
await await_many_dispatch(
File "D:\Projects\New Backend\venv\lib\site-packages\channels\utils.py", line 57, in await_many_dispatch
await task
File "D:\Projects\New Backend\venv\lib\site-packages\channels\utils.py", line 49, in await_many_dispatch
result = task.result()
File "D:\Projects\New Backend\venv\lib\site-packages\channels_redis\core.py", line 367, in receive
message_channel, message = await self.receive_single(
File "D:\Projects\New Backend\venv\lib\site-packages\channels_redis\core.py", line 422, in receive_single
content = await self._brpop_with_clean(
File "D:\Projects\New Backend\venv\lib\site-packages\channels_redis\core.py", line 255, in _brpop_with_clean
connection = self.connection(index)
File "D:\Projects\New Backend\venv\lib\site-packages\channels_redis\core.py", line 738, in connection
self.pools[index] = self.create_pool(index)
File "D:\Projects\New Backend\venv\lib\site-packages\channels_redis\core.py", line 133, in create_pool
return aioredis.ConnectionPool.from_url(host["address"])
File "D:\Projects\New Backend\venv\lib\site-packages\redis\asyncio\connection.py", line 1284, in from_url
url_options = parse_url(url)
File "D:\Projects\New Backend\venv\lib\site-packages\redis\asyncio\connection.py", line 1176, in parse_url
parsed: ParseResult = urlparse(url)
File "C:\Users\luixg\AppData\Local\Programs\Python\Python39\lib\urllib\parse.py", line 392, in urlparse
url, scheme, _coerce_result = _coerce_args(url, scheme)
File "C:\Users\luixg\AppData\Local\Programs\Python\Python39\lib\urllib\parse.py", line 128, in _coerce_args
return _decode_args(args) + (_encode_result,)
File "C:\Users\luixg\AppData\Local\Programs\Python\Python39\lib\urllib\parse.py", line 112, in _decode_args
return tuple(x.decode(encoding, errors) if x else '' for x in args)
File "C:\Users\luixg\AppData\Local\Programs\Python\Python39\lib\urllib\parse.py", line 112, in <genexpr>
return tuple(x.decode(encoding, errors) if x else '' for x in args)
AttributeError: 'int' object has no attribute 'decode'
WebSocket DISCONNECT /ws/chat/hello/ [127.0.0.1:65014]
我正在尝试:
几天来我一直在尝试查看错误,但没有任何问题,我唯一的猜测是可能与我正在使用的库版本发生冲突。
一个达芙妮异步服务器在服务器上运行,并创建单独的容器或单独运行的实例。你不再只是简单地运行你的 python django 项目,但你现在还运行一个 websocket 服务器供你的 django 项目连接。
在其他语言中,这可以通过使用单独的服务器来解决,但是因为您已经使用 daphne django 设计了服务器,所以您可以在每个实例相互连接的单个服务器上运行它。您将必须确保您的服务器配置符合您要执行的操作。即使在生产环境中,它也应该可以简单地重定向来自本地主机的所有 websocket /wss/ 请求,因为我们实际上正在访问我们系统本地的服务器或实例。
考虑以下 apache 服务器配置,如果您在本地运行,则不必为 /ws/ 重写任何规则,但如果您处于生产级别,则需要将您的
http
和 ws
连接重定向到 https
和wss
<VirtualHost _default_:443>
...
RewriteEngine on
RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC,OR]
RewriteCond %{HTTP:CONNECTION} ^Upgrade$ [NC]
RewriteRule .* ws://127.0.0.1:8001%{REQUEST_URI} [P,QSA,L]
ProxyPass /wss/ wss://127.0.0.1:8001/
ProxyPassReverse /wss/ wss://127.0.0.1:8001/
...
然后你必须运行将启动两个实例的 daphne 异步服务器。
daphne -b 0.0.0.0 -p 8001 django_project.asgi:application // Local Development Level
daphne -e ssl:443:privateKey=key.pem:certKey=crt.pem django_project.asgi:application // Production Level
祝你好运,保持警惕!