我正在使用Django频道来实现Web套接字.

我想使用ORM Inside consumers.py获得数据库查询.

这是我的代码:

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. SyncousOnlyOperation:你不能从一个execution上下文调用它—使用一个线程或sync_to_execution.

我也试着

from asgiref.sync import sync_to_async

但我还是得到了同样的错误

推荐答案

你可以试试这个

@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")

Python相关问答推荐

使用新的类型语法正确注释ParamSecdecorator (3.12)

如何让剧作家等待Python中出现特定cookie(然后返回它)?

追溯(最近最后一次调用):文件C:\Users\Diplom/PycharmProject\Yolo01\Roboflow-4.py,第4行,在模块导入roboflow中

在Google Colab中设置Llama-2出现问题-加载判断点碎片时Cell-run失败

使用miniconda创建环境的问题

优化pytorch函数以消除for循环

在线条上绘制表面

如何更改分组条形图中条形图的 colored颜色 ?

"使用odbc_connect(raw)连接字符串登录失败;可用于pyodbc"

Geopandas未返回正确的缓冲区(单位:米)

Maya Python脚本将纹理应用于所有对象,而不是选定对象

在用于Python的Bokeh包中设置按钮的样式

BeautifulSoup-Screper有时运行得很好,很健壮--但有时它失败了::可能这里需要一些更多的异常处理?

使用SQLAlchemy从多线程Python应用程序在postgr中插入多行的最佳方法是什么?'

如何使用加速广播主进程张量?

具有不匹配列的2D到3D广播

在一个数据帧中,我如何才能发现每个行号是否出现在一列列表中?

EST格式的Azure数据库笔记本中的当前时间戳

Groupby并在组内比较单独行上的两个时间戳

Python键盘模块不会立即检测到按键