我想显示倒计时,然后开始游戏循环。代码正在执行并且消息已发送,但我总是收到运行时错误。我对我可以应用的修复或可能更好的解决方案感兴趣。我也在考虑将事物分成两个消费者,但我不知道这将如何解决这个问题。提前致谢。
此错误消息多次弹出。
Task exception was never retrieved
future: <Task finished name='Task-60' coro=<Connection.disconnect() done, defined at D:\Programming\Fullstack\geogame\geogame_backend\env\lib\site-packages\redis\asyncio\connection.py:819> exception=RuntimeError('Event loop is closed')>
Traceback (most recent call last):
File "D:\Programming\Fullstack\geogame\geogame_backend\env\lib\site-packages\redis\asyncio\connection.py", line 828, in disconnect
self._writer.close() # type: ignore[union-attr]
File "C:\Program Files\Python310\lib\asyncio\streams.py", line 337, in close
return self._transport.close()
File "C:\Program Files\Python310\lib\asyncio\selector_events.py", line 698, in close
self._loop.call_soon(self._call_connection_lost, None)
File "C:\Program Files\Python310\lib\asyncio\base_events.py", line 753, in call_soon
self._check_closed()
File "C:\Program Files\Python310\lib\asyncio\base_events.py", line 515, in _check_closed
raise RuntimeError('Event loop is closed')
RuntimeError: Event loop is closed
Run Code Online (Sandbox Code Playgroud)
这是我的消费者
class …
Run Code Online (Sandbox Code Playgroud) 我的目标是设置Django应用程序,从代理检索MQTT消息.(例如,使用Paho MQTT Client).
在我看来,异步提取传入消息将非常适合新的Django频道.因为这将提供事件驱动的设置.
我的问题是:Django Channels确实可以成为桥接MQTT消息的工具吗?如果是这样的话:我怎么能设置它?
我正在尝试使用django渠道的聊天应用程序来使用负载均衡器在AWS Elastic Beanstalk上运行.
我基本上修改了https://github.com/jacobian/channels-example中的代码以使用Elastic Beanstalk.我可以使用该命令在本地成功运行它
python manage.py runserver
Run Code Online (Sandbox Code Playgroud)
问题是当我使用Elastic Beanstalk部署它时,我在启动聊天应用程序时收到以下错误
WebSocket connection to 'wss://mydomain.com/test/' failed: Error
during WebSocket handshake: Unexpected response code: 200
Run Code Online (Sandbox Code Playgroud)
我尝试了在/sf/answers/2088220641/上提出的解决方案,但它只显示了不同的错误代码
WebSocket connection to 'wss://mydomain.com/test/websocket' failed:
Error during WebSocket handshake: Unexpected response code: 404
Run Code Online (Sandbox Code Playgroud)
我还已将负载均衡器侦听器端口更改为TCP 80并获得SSL证书以将安全侦听器端口更改为SSL 443,但仍会收到相同的错误.
我还在AWS Elastic Beanstalk上阅读了带有socket.io的Websockets,但是没有为Django配置代理服务器的选项,我认为它默认使用Apache.
我对Elastic Beanstalk的配置缺少什么使它工作?
有没有办法改变这个,所以我们可以用asgi运行daphne服务器?
django websocket redis amazon-elastic-beanstalk django-channels
我们有运行 Daphne 和 redis 的Django 频道。在我们运行django-websocket-redis之前,它支持开箱即用的心跳 (ping) 消息。我们的客户端代码依赖于这个心跳来确认一个活动的连接,但在 django 中我们并不真正关心它是否仍然处于活动状态。
因此,我们不需要跟踪服务器端的所有内容,但我们确实需要发送心跳。
如何使用频道或达芙妮发送心跳/ping 消息?我找不到这方面的任何文档。
django-websocket-redis 的旧实现只是"--heartbeat--"
每 n 秒发送一个 websocket 消息。文档参考
我读过 Daphne 发送 ping,但我没有看到它们出现在任何地方,我的 websocket 连接只是保持打开状态。
我想制作一个实时游戏,我想使用NodeJS-SocketIO或aiohttp,直到我遇到django-channels,然后我阅读它的文档.
这是一个很好的模块
问题:
我正在尝试设置一个使用 django2.0.2 和 channels2.1.1 的应用程序。我想要实现的是使用后台/工人任务来执行一些会产生数据的工作,这些数据应该动态地出现在网站上。我的问题主要与渠道有关:我如何正确地在工作人员和连接到 websocket 的消费者之间建立通信?
下面是一个突出问题的最小示例:这个想法是用户触发工作线程,工作线程生成一些数据并通过通道层将其发送到连接到 websocket 的消费者。
#routing.py
from channels.routing import ChannelNameRouter, ProtocolTypeRouter, URLRouter
from channels.auth import AuthMiddlewareStack
from django.urls import path
from testApp.consumers import *
application = ProtocolTypeRouter({
"websocket":AuthMiddlewareStack(
URLRouter([
path("wspath",TestConsumer),
]),
),
"channel":ChannelNameRouter({
"test_worker": TestWorker,
}),
})
Run Code Online (Sandbox Code Playgroud)
消费者:
#consumers.py
from channels.consumer import SyncConsumer
from channels.generic.websocket import WebsocketConsumer
from asgiref.sync import async_to_sync
class TestConsumer(WebsocketConsumer):
def websocket_connect(self,message):
async_to_sync(self.channel_layer.group_add)("testGroup",self.channel_name)
self.connect()
#I understand this next part is a bit weird, but I figured it
#is the most concise way …
Run Code Online (Sandbox Code Playgroud) 我今天第一次阅读django-channels的文档,发现以下行Channels will take care of scheduling them and running them all in parallel.
这是否意味着,它也执行 celery 任务?我曾经对芹菜、rabbitmq、mqtt 感到困惑。我以为我很清楚,我对 celery、rabbitmq 和 mqtt 的理解是
celery - 后台作业,任务调度
rabbitmq - 消息代理,向工作人员发送消息
mqtt - 这也是另一个消息队列
在我的理解中,celery 执行后台工作任务以及 rabbitmq 任务或 mqtt 任务。
所以我的问题是,当使用django-channel 时,我们是否需要使用那些列出的堆栈(芹菜,rabbitmq)?如果需要,为什么需要它?我查看了几篇文章,但无法清楚地获得洞察力。我觉得他们的用例有点相似。谁能用现实生活中的例子消除我的困惑?
我正在寻找可以允许将 Django ORM 与 asyncio(使用 PostgreSQL)一起使用的东西。截至目前,我发现只有aiopg在ASYNCIO的生态系统,它允许运行原始SQL或仅使用SQLAlchemy。
然后我在django 频道文档中找到了一些东西。这是:
https://github.com/django/channels/blob/master/channels/db.py
我正在寻找的缺失部分?
谢谢
如果我没有为 websocket 使用上下文,我将如何手动关闭它?当我尝试运行 conn.close() 时出现event loop is closed
错误。这是我到目前为止所拥有的:
from asgiref.sync import async_to_sync
import websockets
# connect -- works OK
conn = async_to_sync(websockets.connect)("ws://localhost:8000/ws/registration/123/")
# send message -- works OK
async_to_sync(conn.send)("hello")
# disconnect -- doesn't work
async_to_sync(conn.close)()
Run Code Online (Sandbox Code Playgroud)
最后一部分应该是什么?
Django 2.1.1、Django 频道 2.1.3、芹菜 4.2.1
我已经在 Celery 中设置了一个任务,在任务结束时,我需要向客户端发送一个 websocket 消息。但是,永远不会发送 websocket 消息。没有抛出任何错误,它只是不发送。
我已经设置了一个使用 Redis 作为后端的通道层。从普通的 Django 视图执行此操作可以正常工作。但是当在 Celery 任务中运行时,它会将消息发送到 Channels,我可以看到 Channels 确实运行了下面我的consumers.py 代码中显示的代码,但客户端从未收到 websocket 消息。
任务.py
def import_job(self):
# (do task calculations, store in data dict)
message = {'type': 'send_my_data',
'data': json.dumps(thecalcs) }
channel_layer = get_channel_layer()
async_to_sync(channel_layer.group_send)('core-data', message)
Run Code Online (Sandbox Code Playgroud)
消费者.py
class AsyncDataConsumer(AsyncWebsocketConsumer):
async def connect(self):
self.channel_group_name = 'core-data'
# Join the group
await self.channel_layer.group_add(
self.channel_group_name,
self.channel_name
)
await self.accept()
async def disconnect(self, close_code):
# Leave the group
await self.channel_layer.group_discard(
self.channel_group_name,
self.channel_name …
Run Code Online (Sandbox Code Playgroud) django-channels ×10
django ×9
websocket ×5
python ×4
python-3.x ×3
celery ×2
aiopg ×1
celerybeat ×1
channels ×1
daphne ×1
mqtt ×1
rabbitmq ×1
redis ×1