将数据从 Django Channels 消费者保存到数据库
Save data to database from Django Channels consumer
我很难从 Django 频道消费者编辑数据库条目,这是涉及的代码片段:
class TestConsumer(AsyncJsonWebsocketConsumer):
async def websocket_connect(self, event):
...
key_query.active_connections = 2
key_query.save()
...
由于我使用的是异步消费者,这会给我以下错误:
You cannot call this from an async context - use a thread or sync_to_async.
我如何从异步消费者执行此操作?也许使用 @database_sync_to_async?
任何建议都将不胜感激!
在 WS 的异步版本中,您还应该将数据库访问转换为异步,因为它通常在同步模式下工作(我指的是数据库查询)。所以你应该通过方法装饰器或其他提到的方式来改变它 here.
解决这个问题的一种方法是使用如下方法和装饰器:
from channels.db import database_sync_to_async
@database_sync_to_async # a method that goes in your TestConsumer class
def update_key_query(self):
key_query = some_obj
key_query.active_connections = 2
key_query.save()
然后在需要时使用它,如下所示:
async def websocket_connect(self, event):
...
await self.update_key_query()
...
我很难从 Django 频道消费者编辑数据库条目,这是涉及的代码片段:
class TestConsumer(AsyncJsonWebsocketConsumer):
async def websocket_connect(self, event):
...
key_query.active_connections = 2
key_query.save()
...
由于我使用的是异步消费者,这会给我以下错误:
You cannot call this from an async context - use a thread or sync_to_async.
我如何从异步消费者执行此操作?也许使用 @database_sync_to_async?
任何建议都将不胜感激!
在 WS 的异步版本中,您还应该将数据库访问转换为异步,因为它通常在同步模式下工作(我指的是数据库查询)。所以你应该通过方法装饰器或其他提到的方式来改变它 here.
解决这个问题的一种方法是使用如下方法和装饰器:
from channels.db import database_sync_to_async
@database_sync_to_async # a method that goes in your TestConsumer class
def update_key_query(self):
key_query = some_obj
key_query.active_connections = 2
key_query.save()
然后在需要时使用它,如下所示:
async def websocket_connect(self, event):
...
await self.update_key_query()
...