目前,二手商品交易成为了当代大学生课余生活的一部分,许多学校每年都要举办红红火火的“跳蚤”市场,可见大学生对二手商品交易的需求很大,遗憾的是校内的二手交易往往时间短暂,无法满足广大学子的需求。目前应用市场上出现了各式各样的交易平台软件,但这些软件通常无法保证买卖双方信誉,可靠性不高。因此,立足于满足高校学生二手物品交易的需要,更为安全和便捷的高校二手物品交易平台应运而生。该平台以Web网站和手机App方式面向在校大学生提供二手物品交易,通过学号等实名制注册来保证交易双方信息的真实,从而保证了交易的可靠性。
校园二手物品交易网站是基于Django框架开发的,该框架是一种十分高效的敏捷Web框架,它把常见的Web开发的问题抽象出来并提供了对频繁编程任务的捷径,可以极大程度提高开发速度。Django可以让校园二手物品交易这样开发复杂的、数据库驱动的网站变得简单。Django是一个优秀的Web框架,它为Web开发提供了必需的组件和工具,更加方便用户的开发。
Django框架
Django是使用Python开发的Web框架,其架构如图1所示。Django对请求的处理机制主要有HTTP请求处理/响应和URL映射模块,HTTP请求处理和响应主要依靠URL的映射关系来找到后台对应的处理逻辑。Django应用的主要部分分为模型层、视图层和模板层,分别对应着数据库的操作部分,请求响应的处理部分和数据展示部分。这三个层面的逻辑需要在关系对象映射(ORM)和模板引擎的支持下运作,ORM机制将复杂的数据库操作简化为对象的操作,构建起视图层和模型层数据交互的通道,模板引擎则支持了模型层数据的展现。Django还提供了对数据库和文件系统的支持,在Django中也可以使用SQL语句操作数据库,并实现文件的上传下载功能。
Django是一个基于MVC构造的框架。但是在Django中,控制器接受用户输入的部分由框架自行处理,所以Django里更关注的是模型(Model)、模板(Template)和视图(Views),称为MTV模式。MTV模式把MVC中的视图层分成视图层和模板层,这样的分解,降低了模块之间的耦合度,更利于后期的维护,因为可以随时更换模版,而不影响程序的逻辑[1]。Django运作方式如图2所示,URLDispatcher根据请求的URL来决定使用哪个后台逻辑处理请求。每一个后台逻辑都将请求转化为一个request对象,request是http请求的对象模型,可以使用request对象来操作http数据,拿到用户操作的数据后,视图层会将数据进行一定操作,提交给模型层,模型层使用关系对象映射(ORM)机制,将数据库的操作转化为对对象的操作。Django还提供了对Mysql,memcahe这些数据库服务的支持,使开发人员可以最少的代码、最快的速度、方便高效地进行各种Web应用的开发和调试[2]。
MTV模式的网站设计
根据需求分析,得出网站的功能架构如图3所示。
网站基于MTV模式分为三层进行设计,视图层负责业务逻辑,根据请求类型返回不同的数据;而模板层负责页面设计;模型层处理与数据相关的所有事务。
模板层设计
模板层是一些前端使用的静态文件,主要负责数据的前端显示功能。在网站设计中,需要在项目中创立一个templates文件夹存放网站所需的静态文件,然后在setting.py中设置好templates目录的路径使得Django可以找到这些静态文件。
根据网站功能架构,模板层设计了登录、注册、查看近期发布、查看用户信息、查看我的收藏等页面。查看近期发布页面如图4所示。页面设计采用了HTML与JavaScript的组合,HTML负责显示DOM元素,JavaScript实现动态效果。用户进入最近发布页面后,浏览器加载html文件,页面使用ajax的post方式将获取最近发布物品信息的http请求发送出去,经过视图层、模型层处理后,从数据库获取最近发布的10条数据,经过模型层处理返回给模板层json格式的数据,模板层解析后交给浏览器渲染成现在的页面。
视图层设计
Django中的视图层主要是用于控制要显示什么数据,如何用代码来与model层中定义的字段进行交互。视图层主要设计的就是视图函数,在校园二手物品交易网站的views.py中设计了一系列的函数,每个函数对应一种请求,比如几个主要页面对应的功能函数有login(登录)、register(注册)、recentBarters(查看最近发布)、getUserInf(o获取用户信息)、createBate(r发布物品)、collectedBarter(s获取我的收藏)、getMyBarters(获取我的发布)等。视图层提供了对session的支持,在用户登录时调用login函数后,系统会生成一个随机的sessionid以标识这次登录活动,并设置了session的过期时间,使用session可以很好地实现用户登录和权限检查的功能。
Django的URLconf机制是使用正则表达式匹配URL并根据匹配结果决定使用哪一个视图函数处理来自这个URL的请求,视图函数调用相应的数据模型来存取数据、调用相应的模板向用户展示页面,视图函数处理结束后返回一个http的响应给前端。
模型层设计
模型层使用的是对象关系映射(ORM),负责服务对象与数据库的关系映射。针对于数据库中的每一张表,模型层都将其映射为一个对象,表中的列映射为对象的一个属性,对对象属性的增删改查在底层就转化为数据库语句,对数据库表进行增删改查。根据用户传来的数据,模型层先根据传来的user_id,转化成底层的SQL语句,从user表中取到一个user的信息,再根据ORM机制,将这个user的信息转化为一个user对象提供给视图层,视图层通过操作user对象就可以实现对数据库的操作,这样可以实现请求处理业务与数据库业务的分离,方便了操作。
使用Django框架不需要先建立数据库表,当定义好DjangoModel后,在初始化时调用Syncdb方法来自动在数据库里面生成相应的表。本系统一共设计了六个模型:未注册用户(包括学号、姓名、学校字段)、已注册用户(包括昵称、姓名、学号、学校、密码、手机号字段)、会话(包括会话ID、昵称字段)、用户收藏(包括昵称、交易shal字段)、物品发布(包括交易shal、昵称、发布时间、交易描述、主题、类别字段)、物品图片(包括图片名称、交易shal字段)。模型层把模型映射生成对应的数据表结构如图5所示。
由于应用目标是在校大学生,为了验证用户的合法性,因此需要提前将授权学校的学生基本信息录入到用户表中,需要字段“学号”“姓名”“学校”。在用户注册之后,需要增加“用户登录名”“密码”“手机号”等信息。在服务器对数据库进行访问的时候,绝大多数时间是对注册过的用户进行访问,同时庞大的未注册用户数量势必会增加对数据库操作的时间,维护起来也相对比较麻烦。因此在模型层设计时,把用户模型分成未注册用户模型和已注册用户模型,这样在服务器对数据库进行访问的时候可以大大增加数据库的访问和查询速度。
数据库优化
校园二手物品交易网站使用MySQL数据库,数据库的所有数据都可以由模型层动态更新,数据库本身的性能优化则由MySQL来完成。
索引策略
从图5可以看到校园二手物品交易网站数据库的六个表都设置了主键,而且在主键上都建立了索引,整个网站在工作的时候大部分时候是在查询发布物品的信息、用户信息、查询我的发布和收藏等,所以建立索引对于查询效率有很大的提高。
当查询用户的发布时,会涉及物品发布表和物品图片表,要对这两个表建立连接查询,两个表中Join的字段是被建过索引的,这样,MySQL内部会启动优化Join的SQL语句的机制。而当用户查询收藏的物品时,会涉及三个表的连接查询,这样对于系统查询效率有很大的提高。
由于网站设计了可以对发布物品进行分类查找,所以在物品发布表的物品种类上也建立了索引,对查询速度进一步优化。
数据类型
数据库最基本的优化之一就是让数据(和索引)在磁盘上(并且在内存中)占据的空间尽可能小。由于校园二手物品交易网站在用户查询最近发布、最近收藏、用户发布的物品时,涉及数据库中的三个表:用户收藏表、物品发布表、物品图片表,而这三个表的信息是不能修改的,所以这三个表的列的数据类型都使用VARCHAR代替CHAR,这样能使每条记录的长度缩减,占据的内存变小,这能给出巨大的改进,因为磁盘读入会变快并且需要更少的主存储器空间。在设计已注册用户表时,由于用户的密码、手机号都是可以修改的,所以采用了CHAR类型,避免了碎片的困扰,也降低了在对表进行更新、插入操作时的对系统的消耗。
使用MySQL Query Cache
根据校园二手物品交易数据库的特性,查询相对比较频繁,而删除、插入、更新操作比较少,所以启用了MySQLQueryCache。
当页面获取最近发布物品、我的发布或收藏时,查询语句通过一定的hash算法进行计算,存放在hash桶中,并把查询到的物品信息存放到内存中,存放queryhash值的链表中存放了hash值和物品信息的内存地址和query涉及的所有table的标识等信息。Web端的查询语句过来会先进行hash计算,如果能够在cache中找到,就直接从内存中取出结果返回给前端,如果没有则MySQL解析器会对SQL进行解析并且优化[3]。这样对于这个读操作占主导的网站的性能有很大的提高。
本文基于Django对校园二手物品交易网站进行了研究与设计,得益于Django框架的高性能,使得开发过程变得简单,而且各模块之间耦合度更低,有利于项目的维护与扩展。本文还针对数据库进行了一系列的优化,使得用户访问网站速度更快,体验更好。校园二手物品交易网站为大学生交易二手物品提供了便利的平台,具有很好的市场前景。目前,校园二手物品交易网站已经在学校IPv6网络环境下测试运行成功。
(作者单位为中国矿业大学(北京)计算机科学与技术系)
参考文献
[1]杨刚.基于Django的在线考试系统的设计与实现[J].电脑知识与技术,2016,14:40-42.
[2]刘班.基于Django快速开发Web应用[J].电脑知识与技术,2009,7:1616-1618.
[3]谷伟,陈莲君基于MySql的查询优化技术研究[J].微型电脑应用,2013,30(7):48-50.