热门标签 | 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,其实我们还可以做更多的事情,比如消息的删除,指定需要发布到哪个消息队列等。


推荐阅读
  • 本文介绍了使用 Python 编程语言高效抓取微博文本和动态网页图像数据的方法。通过详细的示例代码,展示了如何利用爬虫技术获取微博内容和动态图片,为数据采集和分析提供了实用的技术支持。对于对网络数据抓取感兴趣的读者,本文具有较高的参考价值。 ... [详细]
  • 微信支付授权目录配置详解及操作步骤
    在使用微信支付时,若通过WeixinJSBridge.invoke方法调用支付功能,可能会遇到“当前页面URL未注册”的错误提示,导致get_brand_wcpay_request:fail调用微信JSAPI支付失败。为解决这一问题,需要正确配置微信支付授权目录,确保支付页面的URL已成功注册。本文将详细介绍微信支付授权目录的配置步骤和注意事项,帮助开发者顺利完成支付功能的集成与调试。 ... [详细]
  • MySQL性能优化与调参指南【数据库管理】
    本文详细探讨了MySQL数据库的性能优化与参数调整技巧,旨在帮助数据库管理员和开发人员提升系统的运行效率。内容涵盖索引优化、查询优化、配置参数调整等方面,结合实际案例进行深入分析,提供实用的操作建议。此外,还介绍了常见的性能监控工具和方法,助力读者全面掌握MySQL性能优化的核心技能。 ... [详细]
  • 本文探讨了在Lumen框架中实现自定义表单验证功能的方法与挑战。Lumen的表单验证机制默认返回无状态的JSON格式API响应,这给初学者带来了一定的难度。通过深入研究Validate类,作者分享了如何有效配置和使用自定义验证规则,以提升表单数据的准确性和安全性。 ... [详细]
  • 在本文中,我们将探讨如何使用 UniApp 封装小程序 API 请求接口的最佳实践。通过创建 `request.js` 文件,定义基础 URL 并传入后端提供的 URL 作为请求参数。同时,配置请求方法(如 GET、POST)和请求头(例如包含 token 的认证信息),以实现高效、安全的 API 调用。此外,我们还将介绍如何处理请求和响应的错误,以及如何优化请求性能,确保应用在不同平台上的兼容性和稳定性。 ... [详细]
  • Linux 信号处理全面解析(第六篇)
    本文深入探讨了信号及其来源。信号本质上是对中断机制的软件层面模拟,从原理上看,进程接收到信号与处理器接收到中断请求类似。信号具有异步特性,能够在进程执行过程中随时触发,从而中断当前操作并执行相应的处理程序。文章详细分析了信号的生成、传递和处理机制,并讨论了常见的信号类型及其应用场景。此外,还介绍了如何在 Linux 系统中使用信号进行进程间通信和错误处理,为开发者提供了实用的技术指导。 ... [详细]
  • Java服务问题快速定位与解决策略全面指南 ... [详细]
  • 深入解析 Django 中用户模型的自定义方法与技巧 ... [详细]
  • 使用cpphttplib构建HTTP服务器以处理带有查询参数的URL请求 ... [详细]
  • 作为140字符的开创者,Twitter看似简单却异常复杂。其简洁之处在于仅用140个字符就能实现信息的高效传播,甚至在多次全球性事件中超越传统媒体的速度。然而,为了支持2亿用户的高效使用,其背后的技术架构和系统设计则极为复杂,涉及高并发处理、数据存储和实时传输等多个技术挑战。 ... [详细]
  • 在处理高并发场景时,确保业务逻辑的正确性是关键。本文深入探讨了Java原生锁机制的多种细粒度实现方法,旨在通过使用数据的时间戳、ID等关键字段进行锁定,以最小化对系统性能的影响。文章详细分析了不同锁策略的优缺点,并提供了实际应用中的最佳实践,帮助开发者在高并发环境下高效地实现锁机制。 ... [详细]
  • 本课程详细介绍了如何使用Python Flask框架从零开始构建鱼书应用,涵盖高级编程技巧和实战项目。通过视频教学,学员将学习到Flask的高效用法,包括数据库事务处理和书籍交易模型的实现。特别感谢AI资源网提供的课程下载支持。 ... [详细]
  • 本文探讨了在当前正则表达式中支持空格字符的方法。作者尝试在正则表达式中允许空白字符,但遇到了一些问题,导致该表达式无法正确识别空格。文章详细分析了问题的原因,并提出了解决方案,旨在提高正则表达式的灵活性和实用性。 ... [详细]
  • 深入解析 C 语言与 C++ 之间的差异及关联
    深入解析 C 语言与 C++ 之间的差异及关联 ... [详细]
  • 本文深入剖析了ScheduledThreadPoolExecutor的并发执行机制及其源代码,详细解读了该线程池如何在指定延时或定期执行任务,探讨了其内部的工作原理和优化策略,为开发者提供了宝贵的参考和实践指导。 ... [详细]
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社区 版权所有