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