在Django-channels中从异步代码中访问数据库。

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

我需要一些帮助。我正在使用Django-channels,我需要为某些目的进行一些DB调用。文档对我来说不清楚。https:/channels.readthedocs.ioenlatesttopicsdatabases.html。 那么,以下哪种方式是正确的呢? 1. 为每个数据库的访问创建call函数,并使用装饰器。 2. 将所有对数据库的调用都放在一个函数中,用装饰器封装?

python django database asynchronous django-channels
1个回答
0
投票

你可以把对数据库的多次调用放在一个函数中,并由database_sync_to_async装饰器包装,就像下面的一个例子(一个聊天室,如预期的那样:)。

class ChatConsumer(AsyncWebsocketConsumer):

async def connect(self):
    self.room_name = self.scope['url_route']['kwargs']['room_name']
    print(self.scope['user'].username)

    self.room_group_name = 'chat%s' % self.room_name

    await self.channel_layer.group_add(
        self.room_group_name,
        self.channel_name
    )

    await self.accept()

async def disconnect(self, close_code):

    await self.channel_layer.group_discard(
        self.room_group_name,
        self.channel_name
    )


async def receive(self, text_data=None, bytes_data=None):
    text_data_json = json.loads(text_data)
    message = text_data_json['message']
    await self.channel_layer.group_send(
        self.room_group_name,
        {
            'type' : 'chat_message',
            'message' : message
        }
    )


async def chat_message(self , event):
    message = event['message']
    sender = self.scope["user"].username
    receiver = self.scope['path'].split('_')[1]
    await self.post_message(sender = sender , receiver = receiver , message = message)
    await self.send(text_data = json.dumps({'message': message})) 

@database_sync_to_async
def post_message(self , sender  , receiver , message):
    sender = User.objects.filter(username = sender)[0]
    receiver = User.objects.filter(username = sender)[0]
    Message.objects.create(sender = sender , receiver = receiver , text = message)
© www.soinside.com 2019 - 2024. All rights reserved.