APP下载

基于Python Django框架的多媒体发布系统

2018-03-03李洪昌周磊

物联网技术 2018年2期

李洪昌+周磊

摘 要:针对目前传统媒体发布形式制作成本高、内容模式固化,且市场上已有的多媒体发布系统性能单一,维护成本高,无法统一发布并规范管理的弱点,文中采用Python语言和Django框架开发了一套具有实时监控和精准推送的多媒体信息发布系统,充分利用了Python简洁、易扩展和Django方便、快速的特点,较好地改进了传统媒体的弊端。通过线上部署实际使用,证明了本系统在一万台以上设备同时在线的高并发情况下依然能够实现终端精确监控和视频精准推送。

关键词:终端监控;Django;Python;精准推送

中图分类号:TP393 文献标识码:A 文章编号:2095-1302(2018)02-00-03

0 引 言

随着多媒体技术的不断发展,各行各业都受到了冲击,传媒行业亦如此。将多媒体技术应用于广告播放的多媒体系统应运而生,这种用于播放视频广告的多媒体机现已广泛应用于各大卖场,直观地向人们传递需要的信息。然而,现有的媒体发布系统主要仍以本地存储和离线系统为主[1,2],无法由后台进行实时远程管理,维护成本高。

针对目前主流媒体广告机在使用中存在的缺点,基于Python的Django框架设计实现了一种多媒体发布系统,只要能访问互联网,就可以直接对分布在全国各地的终端进行监控、管理和多媒体精准推送,实现集中、实时的精确管理。

本系统采用Python语言和Django框架搭建了一个完整的Web平台。Python是目前最流行的编程语言之一。Django是Python语言编写的最优秀的Web框架之一,采用的MVC框架模式[3]具有易开发,便于更新维护,移植性好等优点。

1 系统总体设计

1.1 Django框架

Django使用Python语言编写,遵循MVC的设计架构,但在具体实现上,会以自己特有的MTV模式体现出来,即Models(模型),Template(模板),View(视图)。

Django的项目结构主要由Urls.py,Views.py,Models.py组成,其中Urls.py为整个项目的路由表,当使用者访问特定的url时,Urls.py将请求指向Views.py(视图函数)中特定的函数,在视图函数中与数据模型进行一系列交互操作来响应用户的请求。Urls.py和Views.py可由MVC中的控制器即Controller来描述[4]。

Django的模式如图1所示。

1.2 系统结构设计

系统采用分层设计,可分为表示层,业务逻辑层和数据访问层,如图2所示。分层设计使得系统具有高内聚,低耦合的特点,当改变针对用户的表现层设计时,不会影响底层的业务逻辑和数据访问,同样,当改变底层结构时,只要提供给上层的JSON数据接口不变,则不会对表现层产生任何影响。三层结构使得系统的各模块独立性比较强,有利于系统的维护、升级,易于资源的分配,降低了开发和运维成本。Django层使得整个App应用独立于项目,可随时移植[4]。

1.3 系统功能需求

通过分析市面上的多媒体机功能,考虑合作公司的需求后,将系统功能需求分为6部分,分别为设备使用者的信息管理,终端设备的管理,媒体文件的上传管理,节目的精准推送,播放数据统计,系统使用者信息管理。在功能设计方面,每部分又可分为多个子模块。

1.4 系统功能设计

根据多媒体发布系统的功能需求分析,该系统由6个功能模块组成。分别为客户管理、终端设备管理、媒体管理、节目单管理、媒体播放数据统计、账户管理,系统功能如图3所示。

客户管理分为客户信息管理、商店管理、代理商管理三个子模块,客户、代理商和商店具有上下级关系,即一个客户有多个代理商,一个代理商有多个商店。每个子模块分别负责该模块信息的录入、修改、删除以及查询下属组织的信息。

终端管理分为终端信息管理、设备监控、地图模式、数据上传四个子模块,是系统的核心之一。终端信息管理模块负责终端信息的添加、修改、删除以及终端的初始化与该终端下的节目信息查询;数据上传模块可以上传表格文件在系统批量生成终端信息;设备监控模块和地图模式分别以不同的方式使管理员直观看到全网的设备状况。

媒体管理分为媒体上传和媒体管理两个子模块,媒体的制作和管理是媒体发布的重要环节。

节目单管理分为四个子模块,分别为添加节目单、节目单管理、定点推送与默认节目单,其中定点推送与默认节目单是媒体发布的核心之一。

数据统计模块分为终端数据统计、客户数据统计、详细数据统计三个子模块,分别为不同层次的媒体播放数据统计。

账户管理模块分为添加用户和用户管理两个子模块,为系统添加除管理员外的其他用户和赋予其相应的权限。

2 系统详细实现

系统的核心设计主要分为终端监控部分和视频推送部分。其核心设计主要包括业务逻辑实现、前端界面实现和数据库設计。业务逻辑基于Django框架,采用Python语言编写。Python是一种面向对象的解释型语言,具有丰富强大的库,可以方便调用其他语言写成的模块(如C/C++),并将其他语言的优势集中起来。

前端展示界面采用jQuery和Bootstrap。jQuery是一个快速、简洁的JavaScript框架,Bootstrap是一个CSS/HTML框架,他们使用方便,效果多样,结合Ajax技术便能够营造出一个完美的用户体验界面,大大方便了用户和系统的交互。

数据库采用MySQL。MySQL是目前最流行的关系型数据库管理系统之一,关系型数据库用不同的二维表来存储数据,增加了存储速度并提高了灵活性。MySQL体积小、速度快、源码开放,已成为中小型网站的不二选择。在Django中用MySQLdb模块来驱动MySQL,在项目中编写Python类,使用ORM映射来操作数据库表。endprint

2.1 终端监控实现

在整个媒体发布系统中,有成千上万台终端在运行,一旦终端发生故障,那么后果不可预料,将对使用者和供应商造成不可避免的损失,因此需要对所有终端进行有效的监控。如图4所示,终端监控在系统中处于核心环节。

系统采取心跳机制以保障监控终端顺畅运行,即终端每隔5 s便发一次请求表明自己的状态,但由于系统中运行的设备数量庞大,如此高频度的请求对服务器造成了巨大的压力,因此利用Python善于处理数据的优势,将数据信息存储在内存中,自定义Sync函数,通过Linux系统的Crontab机制每30 min调用一次Sync函数将内存中的数据写进数据库。查询终端的状况时,如果从内存中查到该终端信息,则渲染到前端,否则,从数据库中取出数据。

终端设备向服务器发送的心跳请求以Http传输,接口协议为自定义的JSON格式。系统接到请求后,在项目中构建一个Python类TerminalManager,所有与终端监控相关的方法均定义在该类中。该类基于Python的基类Object,在构造函数中定义了一个字典对象terminal_heartbeat_dict和一个成员变量heartbeat_lock:

Self.terminal_heartbeat_dict = {}

Self.heartbeat_lock = threading.Lock()

Python中的字典对象是一种类似于哈希表的映射类型对象,是一种可变的容器类型,由多个键值对(key,value)组成。用Threading.Lock()生成一个线程互斥锁[5-7]。当有设备发来请求时,经URLConf调配后,调用TerminalManager类的heartbeat方法,该方法接受一个terminalid(终端编号)参数,每调用一次便将终端编号和当前时间作为一个字典的item存到terminal_heartbear_dict中:

With self.heartbeat_lock:

Self.terminal_heartbeat_dict[terminalid] = now_datetime

在Python中,With语句可以在执行时自动进入和退出With后所跟的上下文管理器对象,常用于对文件的操作和锁机制等。当系统接收到一次请求时便对线程加锁,避免同一时刻对共享资源进行操作引起冲突,更新字典中的值,操作完成后释放锁。

2.2 节目推送实现

媒体发布系统中所有设备的媒体播放都依赖于系统调度,系统调度需要精确到某个商店的某台设备,从而实现精准推送。因此,节目推送也是系统中至关重要的一环。

基于媒体播放系统的实际需求,客户、商店、设备之间都是多对一的关系,节目推送是在视频的基础上生成节目单后再推送,因此视频与节目单为多对多的关系,如图5所示。按照需求,节目单和客户、商店、设备之间又是多对多的关系,数据之间的关系十分复杂,若自己编写数据关系,不仅难以实现,而且容易耦合,更不易于系统的升级与维护。

在Django中,使用ORM技术来操作数据库,开发者通过编写Python类的方式实现数据模型,该數据模型以框架底层作为支撑,映射到数据库中的每张表,类中的属性则对应表中的每个字段[8]。此外,Django还提供了三种最常见的数据库关系,即多对多(many-to-many),多对一(many-to-one),一对一(one-to-one)。直接操作框架中提供的基于Python类的管理器即可实现对数据库的增、删、改、查操作。

以节目推送到设备为例,节目单和设备是多对多的关系。推送时,将节目单的数据库主键id(itemid)和设备的数据库主键id(terminal_id)传到后台,Django通过id获取类的实例,即数据库中的一条数据:

item = Item.objects.get(id=itemid)

terminal = Terminal.objects.get(id=terminal_id)

其中,objects是Django内部封装的类管理器,通过该管理器可以操作类实现数据库层面的增、删、改、查、操作,Django模型操作接口见表1所列。

后台获取到节目单和终端实例后,调用Django的反向查询方法获取该终端下已存在的所有节目单:

Terminalist = terminal.item_set.all()

若节目单item已存在Terminallist中,则忽略;否则调用Django的多对多反向增加方法在数据库中生成第三张表,分别存储节目单id和终端id,见表2所列。

推送完成之后,该终端向服务器发送请求,按照事先约定的协议返回该终端名下所有的视频信息:

{"items":[{"videos":[...],"itemid":"itemid",}],"userid":"terminal_id","respound":"登录成功"}

设备按照解析的数据[9],经由服务器访问静态数据,即可实现定点推送,定点播放。

3 系统部署与应用

在实际生产环境的部署过程中,采用Nginx反向代理uWSGI方式,静态文件由Nginx处理,具体的动态业务逻辑由uWSGI的Django处理。系统的部署结构如图6所示。

系统运行时,前端请求发送到反向代理服务器Nginx,如果请求的是静态文件,则Nginx服务器直接访问服务器磁盘[10,11];如果是动态数据,则把请求代理到Web服务器uWSGI,uWSGI服务器调用Django应用,经过Django中一系列逻辑处理后与MySQL交互数据,然后将处理结果返回给前端展示,实现Web请求。

4 结 语

本文基于Python的Django框架设计实现了一种多媒体发布系统,与现有的媒体发布方式相比,本系统不仅实现了对所有终端设备的实时监控和精确定位,同时还能够实现对单个设备播放内容的精确实时推送。除此之外,采用的Django框架开发,方便后续对系统的自动化维护和升级。

目前该系统上线运行以来,已经在北京、上海、杭州、南京等城市部署安装了一万余台,充分证明了该系统媒体发布的高效性和稳定性。

参考文献

[1]张秋,魏成光.多媒体信息发布系统在大学图书馆的设计与应用——以清华大学人文社科图书馆为例[J].图书馆学研究,2011(20):38-41.

[2]陈艳,叶德建.营销类多媒体信息发布系统终端自动化运维[J].微型电脑应用,2016,32(1):25-29.

[3]白文秀,吴瑞苗.基于Django的运维自动化系统设计[J].智能计算机与应用,2016,6(3):95-97.

[4]杨泽,郑立华,李民赞,等.基于Django的植保无人机飞行监视系统[J].农业网络信息,2016(9):41-47.

[5]陈忠菊.一种基于多线程的高并发任务实现[J].电脑编程技巧与维护,2015(5):41.

[6]肖明魁.Python语言多进程与多线程设计探究[J].计算机光盘软件与应用,2014(15):66-67.

[7]谢红.Python多线程机制初探[J].电脑知识与技术,2011,7(19):4739-4740.

[8]陈红茜,孟超英,邱小彬,等.基于Django的高校合同制人员管理系统[J].华东师范大学学报(自然科学版),2015(S1):464-470.

[9]范文星.基于Django的网络运维管理系统的设计与实现[J].计算机科学,2012,39(S2):175-177.

[10]冯贵兰,李正楠.Nginx反向代理在高校网站系统中的应用研究[J].网络安全技术与应用,2017(6):111-120.

[11]汪文君.基于Nginx服务器集群负载均衡方案的研究和改进[J].电子世界,2017(2):179-181.endprint