Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django-如何在ASGI和WSGI应用程序之间共享数据?_Django_Websocket_Asgi - Fatal编程技术网

Django-如何在ASGI和WSGI应用程序之间共享数据?

Django-如何在ASGI和WSGI应用程序之间共享数据?,django,websocket,asgi,Django,Websocket,Asgi,我在Django上做我的项目,它在WSGI上有Gunicorn,在ASGI上有Daphne。ASGI服务器仅用于处理Websocket协议。使用Django中的通道进行Websocket路由和处理。基于静态和代理的Nginx。数据库是Mysql 一般情况下:是否有一种方法可以在ASGI和WSGI应用程序之间同步内存中的变量值,而无需写入数据库 TLDR: HTTP(wsgi)主要用于与数据库的交互(目前,创建模型实例) Websocket(asgi)计划与用户控件一起使用(目前,连接到房间,将来

我在Django上做我的项目,它在WSGI上有Gunicorn,在ASGI上有Daphne。ASGI服务器仅用于处理Websocket协议。使用Django中的通道进行Websocket路由和处理。基于静态和代理的Nginx。数据库是Mysql

一般情况下:是否有一种方法可以在ASGI和WSGI应用程序之间同步内存中的变量值,而无需写入数据库

TLDR:

HTTP(wsgi)主要用于与数据库的交互(目前,创建模型实例)

Websocket(asgi)计划与用户控件一起使用(目前,连接到房间,将来将是游戏中的控件?旋转块等。该项目是俄罗斯方块多人游戏,用户可以创建房间,例如,当创建房间时,其他玩家可以连接到该房间。)

“引擎盖下”有“引擎”(服务器运行时,一些数据存储在内存中):

创建新房间时,HTTP控制器(来自views.py)调用以下函数:

import engine.status as status
from engine.Room import Room

def create_room(id, size):
    new_room = Room(size)

    ...

    status.active_rooms[id] = new_room

    ...
def make_connect(data):
    id = data['room_id']
    ...
    if int(id) not in status.active_rooms:
        msg = 'No room'
        return {'type': 'info', 'msg': msg}
    else:
        msg = 'Room exists'
        ...
所以,它将一个新的键值对写入dict(status.active_rooms),当key是number(id)时,value是类“Room”的实例

当其他玩家点击房间里的“连接”按钮时,客户端上的Javascript通过Websocket协议发送特殊消息。 Websocket处理程序调用函数:

import engine.status as status
from engine.Room import Room

def create_room(id, size):
    new_room = Room(size)

    ...

    status.active_rooms[id] = new_room

    ...
def make_connect(data):
    id = data['room_id']
    ...
    if int(id) not in status.active_rooms:
        msg = 'No room'
        return {'type': 'info', 'msg': msg}
    else:
        msg = 'Room exists'
        ...
因此,它会检查内存中是否存在具有此id的房间。 问题是: 检查时,dict总是空的似乎ASGI和WSGI应用程序都有各自的“引擎”实例。 这意味着,客户端无法看到服务器上的实际状态。

我试图将数据转储到数据库中,但该类有一些无法pickle的特定字段。 我现在的想法是,使用ASGI应用程序(通过Websocket而不是HTTP)来“创建房间”。
也许我错过了什么?ASGI和WSGI应用程序之间是否有其他方法共享数据?

仅供参考:我设法在发出HTTP请求的同时发出WS-parallel请求

WSGI应用程序写入数据库,ASGI应用程序在内存中创建具有特定键的对象,这些键可用于访问数据库中的数据

在下一个WS请求中,ASGI从内存中的这些对象读取密钥,并调用从DB加载数据的函数。总的来说,ASGI和WSGI不使用相同的环境,但使用在第一次并行HTTP和WS请求中相同的唯一密钥,ASGI可以访问WSGI接收的数据