ASGI/Daphne Django 问题中的 AttributeError

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

我已经用 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]

我正在尝试:

  1. Django=4.1.2 通道=4.0.0 daphne=4.0.0 python=3.9.10

几天来我一直在尝试查看错误,但没有任何问题,我唯一的猜测是可能与我正在使用的库版本发生冲突。

python django websocket django-channels daphne
1个回答
0
投票

一个达芙妮异步服务器在服务器上运行,并创建单独的容器或单独运行的实例。你不再只是简单地运行你的 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

祝你好运,保持警惕!

© www.soinside.com 2019 - 2024. All rights reserved.