属性错误: 模块 asyncio 中没有属性 _get_running_loop

2024-10-02 08:29:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用channels来实现WebSockets。 我试图从post_savedjango信号通过websocket发送数据。 下面是我的代码。在

信号.py

@receiver(post_save, sender=CheckIn)
def send_data_on_save(sender, instance, **kwargs):
    channel_layer = get_channel_layer()
    stats = get_stats()
    async_to_sync(channel_layer.group_send)(
            'dashboard',
            {
                'type': 'send_data',
                'message': stats
            }
        )

    analytics = get_analytics()
    async_to_sync(channel_layer.group_send)(
            'analytic',
            {
                'type': 'send_data',
                'message': analytics
            }
        )

消费者.py

^{pr2}$

这段代码在我的本地计算机(windows)上运行,但当我试图在服务器(Ubuntu16.04)上运行此代码时,我遇到了如下错误:

回溯

Exception inside application: module 'asyncio' has no attribute '_get_running_loop'
    File "/usr/lib/python3.5/asyncio/tasks.py", line 241, in _step
        result = coro.throw(exc)
    File "/home/user1/demowebapps/env/lib/python3.5/site-packages/channels/sessions.py", line 183, in __call__
        return await self.inner(receive, self.send)
    File "/home/user1/demowebapps/env/lib/python3.5/site-packages/channels/middleware.py", line 41, in coroutine_call
        await inner_instance(receive, send)
    File "/home/user1/demowebapps/env/lib/python3.5/site-packages/channels/consumer.py", line 59, in __call__
        [receive, self.channel_receive], self.dispatch
    File "/home/user1/demowebapps/env/lib/python3.5/site-packages/channels/utils.py", line 52, in await_many_dispatch
        await dispatch(result)
    File "/home/user1/demowebapps/env/lib/python3.5/site-packages/asgiref/sync.py", line 145, in __call__
        return await asyncio.wait_for(future, timeout=None)
    File "/usr/lib/python3.5/asyncio/tasks.py", line 373, in wait_for
        return (yield from fut)
    File "/usr/lib/python3.5/asyncio/futures.py", line 361, in __iter__
        yield self  # This tells Task to wait for completion.
    File "/usr/lib/python3.5/asyncio/tasks.py", line 296, in _wakeup
        future.result()
    File "/usr/lib/python3.5/asyncio/futures.py", line 274, in result
        raise self._exception
    File "/usr/lib/python3.5/concurrent/futures/thread.py", line 55, in run
        result = self.fn(*self.args, **self.kwargs)
    File "/home/user1/demowebapps/env/lib/python3.5/site-packages/channels/db.py", line 14, in thread_handler
        return super().thread_handler(loop, *args, **kwargs)
    File "/home/user1/demowebapps/env/lib/python3.5/site-packages/asgiref/sync.py", line 164, in thread_handler
        return func(*args, **kwargs)
    File "/home/user1/demowebapps/env/lib/python3.5/site-packages/channels/consumer.py", line 105, in dispatch
        handler(message)
    File "/home/user1/demowebapps/env/lib/python3.5/site-packages/channels/generic/websocket.py", line 39, in websocket_connect
        self.connect()
    File "/home/user1/demowebapps/vmsbackend/check_in/consumers.py", line 57, in connect
        self.channel_name
    File "/home/user1/demowebapps/env/lib/python3.5/site-packages/asgiref/sync.py", line 41, in __call__
        if asyncio._get_running_loop() is not None:
    module 'asyncio' has no attribute '_get_running_loop'

另外,当我从javascript.send()函数正常发送数据时,它在服务器上正常工作,但是当post_save信号被调用时,只有我在服务器上收到这个错误。这在我的本地系统上运行得很好。 我尝试从信号中删除async_to_sync,但它没有给出错误,但它没有通过web套接字传输数据。 然后是给予:

./check_in/signals.py:47: RuntimeWarning: Coroutine'RedisChannelLayer.group_send' was never awaited
'message': analytics

我在本地和服务器上都使用pythom 3.5.2。在

我不知道怎么了。是代码还是别的什么。感谢任何帮助。 谢谢


Tags: inpyselfenvsendasynciohomelib
1条回答
网友
1楼 · 发布于 2024-10-02 08:29:02

根据堆栈跟踪判断,asgiref正在访问私有异步函数_get_running_loop,以获得相当于旧Python版本中3.7的^{}的功能。但是你运行的是3.5.2,它甚至没有私有功能。在

尝试将Python升级到3.6或3.7版本,一切都会成功的。在

相关问题 更多 >

    热门问题