热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

DjangoXadmin改造:整合redis作为消息队列管理后台

    最近刚好需要使用到消息队列,与rabbitmq比较之后,发现redis更容易上手。虽然比起redis,rabbitmq对消息队列的功能支持更强大&#x

    最近刚好需要使用到消息队列,与rabbitmq比较之后,发现redis更容易上手。虽然比起redis,rabbitmq对消息队列的功能支持更强大;而且redis不比rabbitmq——默认自带消息队列的管理后台。所以,我这里使用Django的xadmin进行了改造,来作为redis一个简单的消息队列可视化管理。效果如下图: 

 

   由于默认的xadmin功能是对数据库里的数据进行显示,所以这里需要进行一些自定义修改。xadmin一般默认是MySQL进行对接,将表里的数据在页面上显示出来。所以我原本的思路是,修改对models的查询结果,将xadmin从mysql查询的数据改到从redis查询。但通过查看源码发现,xadmin的前端显示与后端返回的queryset对象进行了绑定,通过遍历queryset对象的属性来获取查询数据的,很难找到在中间修改数据源的位置。所以这里是直接重写了部分前端代码。

   为了支持功能的扩展,这里的消息获取使用drf的APIView接口:

class MsgQueueAPI(APIView):def post(self, request):conn = redis.StrictRedis()res = conn.zrange("task", 0, -1)return HttpResponse('{"status":"success","res":' + json.dumps(res, ensure_ascii=False) + '}',content_type="application/json")

   这里从redis的有序集合中获取所有的消息,以json的形式返回到前端。为了将消息整合到xadmin中显示,需要新增一个models:

class Queue(models.Model):msg = models.CharField(max_length=10, verbose_name=u"队列消息", default=u"", null=True, blank=True)class Meta:db_table = "msg_queue"verbose_name = u"消息"verbose_name_plural = verbose_namedef __unicode__(self):return u"消息"

   这里的models只有一个字段,但由于后面对前端的显示进行了自定义改造,所以这里的字段、包括数据库里的数据没有什么意义,只是为了xadmin上的显示。接下来,要对关联models的adminx进行一些特殊处理:

class QueueAdmin(object):msg = Truelist_display = ['msg']search_fields = []list_filter = []list_export = ()list_exclude = ['id']def save_models(self):msg = self.new_obj.msgconn = redis.StrictRedis()conn.zadd("task", time.time(), msg)xadmin.site.register(Queue, QueueAdmin)
xadmin.site.register_plugin(MsgQueuePlugin, ListAdminView)

   先说说从list_display向下的一些属性,是为了移除一些管理界面上用不到的功能,如过滤器、搜索框、导出数据功能等;这里要注意的是save_models方法,它重写了原来向MySQL数据的功能,通过new_obj先获取到增加数据界面提交的内容,但是不往MySQL里保存,而是向redis的队列里插入消息内容。通过save_models方法的特性,执行完该方法后,会自动跳转到列表显示页面。接下来要做的,就是在列表显示页面加载时调用上面写的MsgQueueAPI读取消息。

   新建一个msgQueue.js文件,并在加载时向MsgQueueAPI接口发送ajax请求。然后通过xadmin的自定义插件来加载js文件:

class MsgQueuePlugin(BaseAdminPlugin):msg = Falsedef init_request(self, *args, **kwargs):return bool(self.msg)def get_media(self, media):media.add_js([self.static('js/jquery.min.js'),self.static('js/ajaxSetup.js'),self.static('js/jquery.COOKIE.js'),self.static('js/sendAjax.js'),self.static('js/msgQueue.js')])return media

   这里已经在第三个代码片段通过xadmin.site.register_plugin的方式加载了该插件,并在QueueAdmin中配置msg为True使插件生效。在MsgQueuePlugin插件中可以看到,重写了get_media方法并加载了我们刚刚创建的msgQueue.js文件。

    最后记得,js获取到请求数据后,通过jquery修改xadmin原有页面的部分html结构,将消息显示出来。这里只是做了简单的消息展示。通过前端的js,其实我们还可以做更多的事情,比如消息的删除,指定需要发布到哪个消息队列等。


推荐阅读
  • Django Token 认证详解与 HTTP 401、403 状态码的区别
    本文详细介绍了如何在 Django 中配置和使用 Token 认证,并解释了 HTTP 401 和 HTTP 403 状态码的区别。通过具体的代码示例,帮助开发者理解认证机制及权限控制。 ... [详细]
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • PHP 5.2.5 安装与配置指南
    本文详细介绍了 PHP 5.2.5 的安装和配置步骤,帮助开发者解决常见的环境配置问题,特别是上传图片时遇到的错误。通过本教程,您可以顺利搭建并优化 PHP 运行环境。 ... [详细]
  • 本文详细介绍了如何使用 Yii2 的 GridView 组件在列表页面实现数据的直接编辑功能。通过具体的代码示例和步骤,帮助开发者快速掌握这一实用技巧。 ... [详细]
  • 使用 Azure Service Principal 和 Microsoft Graph API 获取 AAD 用户列表
    本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ... [详细]
  • 本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ... [详细]
  • 扫描线三巨头 hdu1928hdu 1255  hdu 1542 [POJ 1151]
    学习链接:http:blog.csdn.netlwt36articledetails48908031学习扫描线主要学习的是一种扫描的思想,后期可以求解很 ... [详细]
  • 本文详细介绍了Python编程语言的学习路径,涵盖基础语法、常用组件、开发工具、数据库管理、Web服务开发、大数据分析、人工智能、爬虫开发及办公自动化等多个方向。通过系统化的学习计划,帮助初学者快速掌握Python的核心技能。 ... [详细]
  • 本文介绍如何在Spring Boot项目中集成Redis,并通过具体案例展示其配置和使用方法。包括添加依赖、配置连接信息、自定义序列化方式以及实现仓储接口。 ... [详细]
  • Java项目分层架构设计与实践
    本文探讨了Java项目中应用分层的最佳实践,不仅介绍了常见的三层架构(Controller、Service、DAO),还深入分析了各层的职责划分及优化建议。通过合理的分层设计,可以提高代码的可维护性、扩展性和团队协作效率。 ... [详细]
  • 本文档汇总了Python编程的基础与高级面试题目,涵盖语言特性、数据结构、算法以及Web开发等多个方面,旨在帮助开发者全面掌握Python核心知识。 ... [详细]
  • 构建基于BERT的中文NL2SQL模型:一个简明的基准
    本文探讨了将自然语言转换为SQL语句(NL2SQL)的任务,这是人工智能领域中一项非常实用的研究方向。文章介绍了笔者在公司举办的首届中文NL2SQL挑战赛中的实践,该比赛提供了金融和通用领域的表格数据,并标注了对应的自然语言与SQL语句对,旨在训练准确的NL2SQL模型。 ... [详细]
  • 数据库内核开发入门 | 搭建研发环境的初步指南
    本课程将带你从零开始,逐步掌握数据库内核开发的基础知识和实践技能,重点介绍如何搭建OceanBase的开发环境。 ... [详细]
  • 本文由瀚高PG实验室撰写,详细介绍了如何在PostgreSQL中创建、管理和删除模式。文章涵盖了创建模式的基本命令、public模式的特性、权限设置以及通过角色对象简化操作的方法。 ... [详细]
  • 深入解析Redis内存对象模型
    本文详细介绍了Redis内存对象模型的关键知识点,包括内存统计、内存分配、数据存储细节及优化策略。通过实际案例和专业分析,帮助读者全面理解Redis内存管理机制。 ... [详细]
author-avatar
幸福的妈妈88
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有