Django Channels - 无法在断开连接时发送消息

2024-04-24

我希望能够在用户断开连接时向房间组发送消息,以便更新玩家列表。似乎一旦断开连接就不可能了,这在某种程度上是有意义的,但是在断开用户连接之前我如何能够向通道发送消息。

我有以下代码:

async def disconnect(self, close_code):
    #Remove the disconnected player
    player = players.get_player(self.scope['session']['id'])
    players.remove_player(player.id)
    room = rooms.get_room(player.room)
    if room:
        #Sending messages on disconnect doesn't seem to work
        players_left = room.leave_room(player)
        if players_left < 1:
            rooms.remove_room(room.name)
            await self.channel_layer.group_send(
                'all_users',
                {
                    'type': 'room_list',
                }
            )
            await self.channel_layer.group_discard(
                room.name,
                self.channel_name
            )
        else:
            await self.send_room(room,'list_players')
            
async def send_room(self,room,type):
    await self.channel_layer.group_send(
        room.name,
        {
            'type': type,
            'data': room.name
        }
    )

async def list_players(self,event):
    # Send message to WebSocket
    room = rooms.get_room(event['data'])
    players = room.get_players()
    await self.send(text_data=json.dumps({
        'action': 'room_list_players',
        'payload' : {
            'players' : players,
            'owner' : room.owner.id
        }
    }))

这是一个老问题,我不知道是否有人仍然需要它的答案,但我在 Django Channels 3.0.1 中找到的解决方案实际上非常简单。每个WebsocketConsumer has a websocket_disconnect定义的函数在调用实际之前删除当前分配给 websocket 的组disconnect功能。显然这意味着当你到达时disconnect您无法再发送群组消息,因为没有群组。

解决方案是简单地覆盖websocket_disconnect并将您的消息发送到那里,内容如下:

async def websocket_disconnect(self, message):
  await self.channel_layer.group_send(
    self.room_group_name,
    { 'type': 'dc_message' }
  )
  await super().websocket_disconnect(message)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Django Channels - 无法在断开连接时发送消息 的相关文章

  • 为什么 Django 的 URLField 默认截断为 200 个字符?

    我喜欢 Django 并且经常使用它 我发现它的大部分默认设置都是正常的 但有一个一直困扰着我 以至于我在每个项目中都覆盖了它 a 的默认最大长度URLField https github com django django blob st
  • 无法安装 psycopg2 Ubuntu

    试图为 django 项目准备好服务器 但我在设置 postgres 时遇到了一些问题 我正在遵循本指南 https jee appy blogspot com 2017 01 deply django with nginx html ht
  • 静态文件配置不正确

    我已经在 Heroku 上部署了简单的博客应用程序 它运行在Django 1 8 4 我在静态文件方面遇到了一些问题 当打开我的应用程序时 我看到Application Error页面 所以我尝试调试它并发现当我提交到 Heroku 时它无
  • 使用信号时出现 django TransactionManagementError

    我有一个与 django 的用户和 UserInfo 一对一的字段 我想订阅用户模型上的 post save 回调函数 以便我也可以保存 UserInfo receiver post save sender User def saveUse
  • Django 如何从 ManyToManyField 序列化并列出全部

    我正在使用 Django 1 9 1 开发移动应用程序后端 我实现了关注者模型 现在我想列出用户的所有关注者 但目前我不得不这样做 我还使用 Django Rest 框架 这是我的 UserProfile 模型 class UserProf
  • 如何使用数据库在 Django 中的应用程序之间交换数据?

    我正在使用 Django 在网络上工作 我创建了 2 个应用程序 第一个用于客户端注册并将其数据添加到数据库 第二个应用程序供用户访问和查看交互界面 这个想法是使用第二个应用程序从数据库中的客户端获取数据 并使用它向用户显示一些信息 我的问
  • django_debug_toolbar 和 Docker

    因此 我让 docker 和 Django 在本地工作 首先从 Dockerfile 构建一个映像 然后使用 Fig 获取 postgres 映像 将其链接到基础映像 然后运行本地服务器 除了 django debug toolbar 之外
  • 测试中的模型 - Django 1.7 问题

    我正在尝试将我的项目移植为使用 Django 1 7 除了一件事之外 一切都很好 测试文件夹内的模型 Django 1 7 新迁移在内部运行 migrate 命令 在运行syncdb之前 这意味着如果模型未包含在迁移中 它将不会填充到数据库
  • 扩展 Django 1.11 用户模型

    我正在尝试弄清楚如何扩展 Django 用户模型以向用户添加信息 我似乎无法让它发挥作用 我究竟做错了什么 我可以在扩展的同一模型中使用外键吗 如何创建超级用户 还是必须通过手动创建python manage py shell 到目前为止
  • 防止 Django 在并发请求时多次将同一对象保存到数据库

    对于我们的博客平台 我们有一个 文章 模型 其中包含一个 更新的 日期时间字段 class Article models Model updated models DateTimeField null True blank True 当任何
  • 将 Django 表单中的所有 CharField 表单字段输入转换为小写

    我使用 Django 表单进行用户注册 用户可以在其中输入优惠券代码 我希望在优惠券代码字段中输入的所有字符都转换为小写 我尝试过在保存方法 自定义清理方法和自定义验证器中使用 lower 但这些方法没有运气 下面是我的代码 class S
  • Django Group权限如何在模板中打印

    如果客户登录并且有权查看管理员授予他的数据 则他在登录后将看到数据 但如果管理员没有授予他权限 则会显示此消息您无权查看此页面 就我而言 无论管理员授予什么权限 此消息始终会出现您无权查看此页面 from decorators import
  • Django:从登录页面重定向登录用户

    我想设置我的网站 以便如果用户点击 login页面并且他们已经登录 它会将他们重定向到主页 如果他们没有登录 那么它将正常显示 既然登录代码内置于 Django 中 我该如何做到这一点 我假设您当前正在使用内置登录视图 r accounts
  • 将应用程序级别用户名/用户 ID 注入 nginx/Apache 日志

    有没有办法将应用程序级别的用户名或 id 在本例中为 django 用户名或 id 注入 Apache 或 ngnix 日志中 请注意 我不是询问 HTTP 身份验证用户名 我目前正在使用一个简短的自定义中间件将此数据添加到响应标头 如下所
  • django 南迁移,不设置默认值

    我使用 South 来迁移我的 Django 模型 然而 南方有一个令人讨厌的错误 它不会在 Postgres 数据库中设置默认值 例子 created at models DateTimeField default datetime no
  • 使用 django-filters 设置初始值?

    当使用Django 过滤器 https django filter readthedocs orgapp 如何设置过滤器中字段的初始值 通常采用标准形式Django 例如一个简单的选择列表形式 class MyForm forms Form
  • 在我的 django 代码中获取 KeyError

    我对 Django 和 Python 都很陌生 所以如果我显得很烦人 请原谅我 我只是被误导了 错误代码 http i gyazo com 68d88cabf536b129dc37cde6c3ae319c png http i gyazo
  • ManyRelatedManager 对象不可迭代

    尝试这样做 wishList WishList objects get pk 20 matches val for val in Store attribute answers all if val in wishList attribut
  • 无法使用 django-mssql 提供程序

    有谁知道如何使用 django mssql 提供程序 我已经安装了要求 但无法让它工作 如果 settings py 中没有 sqlserver ado 它可以正常导入 testenv C Users Robin test gt pytho
  • 如何使用 celery 和 Django 以编程方式生成 celerybeat 条目

    我希望能够以编程方式生成 celerybeat 条目并在添加条目时重新同步 celerybeat 文档here http ask github com celery userguide periodic tasks html state 默

随机推荐

  • ggplot2:更改条形图上堆栈的顺序

    我正在尝试使用facet wrap制作堆叠条形图 但我希望翻转堆叠变量 开发 的顺序 我已经重新排序了这些因素 并尝试了 order descend 以及 scale fill manual 但似乎没有任何效果 这是我的代码 develop
  • C# Process.MainWindowHandle 始终返回 IntPtr 零

    这是我的代码 using Process game Process Start new ProcessStartInfo FileName DatabaseCheck exe RedirectStandardOutput true Crea
  • ListView Viewholder 复选框状态

    我的 ListView 自定义适配器 及其新实现的 viewHolder 有一些问题 我有一个 ListView 其中每个项目都有一个复选框 这里没有什么新内容 问题是 如果我的列表中有超过 9 个项目 当我选中第一个复选框时 第十个将被自
  • 在所有列上 apply() 自定义函数提高效率

    我应用这个功能 def calculate recency for one column column pd Series gt int Returns the inverse position of the last non zero v
  • 如何让Visual Studio推荐unity代码

    我一直在学习 C 和 Unity 但我遇到的一个问题是 在 Visual Studio 上编写 C 脚本时 VS 似乎总是推荐对 Unity 无用的脚本 一个例子是当我输入Vector3 它会推荐BitVector32 你不能忽略它们 就好
  • CngKeyBlobFormat 支持的实际格式是什么?

    Microsoft 页面提供了有关可使用的格式的 最少 信息CngKey 导入 https msdn microsoft com en us library bb344680 v vs 110 aspx Which actual格式实际上由
  • 创建透明渐变并将其用作 SpriteKit 中的 alpha 遮罩

    我正在尝试制作渐变并将其用作 alpha 蒙版 现在 我能够制作与此类似的图像 从黑色到透明 这是我用来实现这一切的代码 private func createImage width CGFloat height CGFloat gt CG
  • cin.get() 是非阻塞的

    我有与链接问题中提到的相同的问题 控制台窗口 在 VS 2010 中 在运行程序后立即消失 我使用 cin get 在主函数的末尾 但问题仍然存在 对可能的原因有什么想法吗 您可以查看main中的代码 int main const int
  • 如何动态地将新选项卡添加到红色选项卡面板中

    假设您有一个像这样的选项卡面板 editor layout below t tab panel 350x350 tab 1 below b button 75x25 Interpret on click do a text a area 3
  • 基于一个键将数据从 df 复制到多列中的另一个 df

    我有两个数据框 df1 和 df2 每个数据帧的唯一标识符是 ID 和 Prop Number 我需要将 df1 中的 Num1 2 和 3 列复制到 df2 1 Num 中的相应列 但我不确定如何对多个列进行合并 我想将 df2 保留为
  • 绝对中心流体div

    再会 我知道如果你想将 div 绝对居中 你可以这样做 div div blahblah div div CSS parent width 500px height 500px position absolute or relative t
  • Cordova DeviceReady 未触发

    这几天我一直在为这个问题苦苦思索 在尝试创建新的 FileTransfer 对象时出现许多 对象未定义 错误后 看起来问题更加基本 不知何故 DeviceReady 事件没有触发 Stack Overflow 在这个问题上有很多点击 但其中
  • 使用 nHibernate 序列化 DetachedCriteria

    我正在尝试序列化 DetachedCriteria 以便可以将其保存在数据库中并在以后重用相同的条件 当我运行下面的代码时 我得到 NHibernate Criterion DetachedCriteria 无法序列化 因为它没有无参数构造
  • Wagtail / Hallo.js - 添加插件但修改的内容未保存

    我正在 Wagtail 1 3 1 Django 1 7 11 上运行 我已经激活了 Hallohtml 和 Hallojustify 插件 它们出现在工具栏中 没有图标 但有按钮 可以使用按钮 并且可以在文本区域中看到修改 我的意思是 例
  • 如何使以下 readAsDataURL 返回多个 readAsDataURL?

    此函数读取从输入字段获取的文件并返回其 dataUrls readAsDataURL target target gt
  • 无法使用 Spring 的 WebServiceTemplate 将 Http 标头添加到消息中

    我有一个相当简单的情况 我尝试将 HTTP 标头 不是 SOAP 标头 添加到我使用 Spring 发出的请求中WebServiceTemplate 我定义了一个ClientInterceptor我在哪里做 Override public
  • Numpy 中如何获得向量的大小?

    为了与 只有一种明显的方法可以做到这一点 保持一致 如何在 Numpy 中获取向量 一维数组 的大小 def mag x return math sqrt sum i 2 for i in x 上面的方法有效 但是我无法相信我必须自己指定这
  • Android JNI异常处理

    我需要在 JNI 代码中实现异常处理 我不擅长 jni 找不到任何好的例子 因此 请提供完整的示例 这就是我正在做的 jint JNI OnLoad JavaVM vm void reserved jint result 1 g JavaV
  • 为什么 nhibernate 3.3 不允许 ICollection 上的私有 setter?

    我从 nhibernate 3 2 升级到 nhibernate 3 3 并且在我的域类中定义了很多虚拟成员 如下所示 public virtual ICollection
  • Django Channels - 无法在断开连接时发送消息

    我希望能够在用户断开连接时向房间组发送消息 以便更新玩家列表 似乎一旦断开连接就不可能了 这在某种程度上是有意义的 但是在断开用户连接之前我如何能够向通道发送消息 我有以下代码 async def disconnect self close