校園二手物品交易網站是基于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格式的數據,模闆層解析後交給浏覽器渲染成現在的頁面。
圖4最近發布頁面
視圖層設計
Django中的視圖層主要是用于控制要顯示什麼數據,如何用代碼來與model層中定義的字段進行交互。視圖層主要設計的就是視圖函數,在校園二手物品交易網站的views.py中設計了一系列的函數,每個函數對應一種請求,比如幾個主要頁面對應的功能函數有login(登錄)、register(注冊)、recentBarters(查看最近發布)、getUserInfo(獲取用戶信息)、createBater(發布物品)、collectedBarters(獲取我的收藏)、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類型,避免了碎片的困擾,也降低了在對表進行更新、插入操作時的對系統的消耗。
使用MySQLQueryCache
根據校園二手物品交易數據庫的特性,查詢相對比較頻繁,而删除、插入、更新操作比較少,所以啟用了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.