django.core.exceptions.SynchronousOnlyOperation 不能在异步上下文中调用 - 请使用线程或sync_to_async
我正在使用Django的channels来实现WebSocket功能。
我想在consumers.py
文件中使用ORM来进行数据库查询。
这是我的代码:
import json
from channels.generic.websocket import AsyncWebsocketConsumer
from .models import Game
from accounts.models import CustomUser as User
from channels.db import database_sync_to_async
class CameraStreamConsumer(AsyncWebsocketConsumer):
def __init__(self, *args, **kwargs):
print("initializing")
self.counter = 0
super().__init__(*args, **kwargs)
async def connect(self):
await self.accept()
print("accepted connection")
async def disconnect(self, close_code):
pass
print("disconect connection")
async def receive(self, text_data=None,):
print(" iam getting data online")
data = json.loads(text_data)
if data.get('type') == 'started':
await self.handle_game_started(data)
async def get_game(self, game_id):
game_obj = await database_sync_to_async(Game.objects.get)(id=game_id)
return game_obj
async def get_user(self, user_id):
user_obj = await database_sync_to_async(User.objects.get)(id=user_id)
return user_obj
async def handle_game_started(self, data):
game_id = data.get('game_id')
user_id = data.get('user_id')
game_obj = await self.get_game(game_id)
user_obj = await self.get_user(user_id)
if game_obj and user_obj:
game_creator = game_obj.creator
if game_creator == user_obj:
print("user is creator")
await self.send(text_data=json.dumps({'message': f'Game {game_id} Started'}))
但是我遇到了这个错误:
django.core.exceptions.SynchronousOnlyOperation: 你不能在异步环境中调用这个 - 请使用线程或sync_to_async。
我也尝试了这个:
from asgiref.sync import sync_to_async
但我还是得到了同样的错误。
1 个回答
0
你可以试试这个
@database_sync_to_async
def get_user(self, user_id):
return User.objects.filter(id=user_id).last()
async def handle_game_started(self, data):
user_id = data.get('user_id')
user_obj = await self.get_user(user_id)
print(user_obj, "userobjects")