Django簡(jiǎn)介以及模型定義概述
自分層結(jié)構(gòu)的 Web 設(shè)計(jì)理念普及以來,選擇適合的開發(fā)框架無疑是項(xiàng)目成功的關(guān)鍵。在動(dòng)態(tài)語言領(lǐng)域,Python、Ruby、Groovy 等語言在 Web 開發(fā)中的應(yīng)用日益廣泛。剛剛度過兩周年生日的 Python 語言 Web 框架 Django,以其新穎簡(jiǎn)潔的開發(fā)模式和巨大的發(fā)展?jié)摿Γ饾u贏得大量開發(fā)者的青睞。本文通過完整的代碼示例,詳細(xì)敘述 Django框架應(yīng)用于 Web 開發(fā)的整個(gè)流程,并幫助開發(fā)者了解 Django 框架所帶來的高效與便捷。
前言
傳統(tǒng) Web 開發(fā)方式常常需要編寫繁瑣乏味的重復(fù)性代碼,不僅頁面表現(xiàn)與邏輯實(shí)現(xiàn)的代碼混雜在一起,而且代碼編寫效率不高。對(duì)于開發(fā)者來說,選擇一個(gè)功能強(qiáng)大并且操作簡(jiǎn)潔的開發(fā)框架來輔助完成繁雜的編碼工作,將會(huì)對(duì)開發(fā)效率的提升起到很大幫助。幸運(yùn)的是,這樣的開發(fā)框架并不少見,需要做的僅是從中選出恰恰為開發(fā)者量身打造的那款Web框架。
自從基于 MVC 分層結(jié)構(gòu)的 Web 設(shè)計(jì)理念普及以來,選擇適合的開發(fā)框架無疑是項(xiàng)目成功的關(guān)鍵性因素。無論是 Struts、Spring 或是其他 Web 框架的出現(xiàn),目的都是為幫助開發(fā)者把所有的編碼工作打理的井井有條、賞心悅目。在動(dòng)態(tài)語言領(lǐng)域,Python、Ruby、Groovy 等語言在 Web 開發(fā)中也逐漸發(fā)展壯大,掀起一浪接一浪的開發(fā)熱潮。面對(duì) Ruby on Rails 漸漸深入人心的宣傳攻勢(shì)和火熱勢(shì)頭,更為成熟且不乏優(yōu)秀程序員的Python 社區(qū)也紛紛推出欲與之抗衡的Web開發(fā)框架。在對(duì) Python 旗下的開發(fā)框架經(jīng)過一番取舍比較之后,筆者選擇了 Python 框架 Django 作為 Web 開發(fā)框架的***,究其緣由,就是看中了 Django 新穎簡(jiǎn)潔的開發(fā)模式和巨大的發(fā)展?jié)摿Α?/P>
在下面的章節(jié)里,將通過一個(gè)完整的 Django 框架 Web 開發(fā)示例,詳細(xì)講解開發(fā)過程中 MVC 各層次代碼編寫過程中所需的各種要素與資源,通過實(shí)例體驗(yàn) Django 為 Web開發(fā)者帶來的高效與便捷。
細(xì)說Django
Django 是應(yīng)用于 Web 開發(fā)的高級(jí)動(dòng)態(tài)語言框架,最初起源于美國芝加哥的 Python 用戶組,具有新聞從業(yè)背景的 Adrian Holovaty 是 Django 框架的主要開發(fā)者。在 Adrian 的帶領(lǐng)下,Django 小組致力于為 Web 開發(fā)者貢獻(xiàn)一款高效***的Python 開發(fā)框架,并且在 BSD 開放源代碼協(xié)議許可下授權(quán)給開發(fā)者自由使用。
Django 擁有完善的模板機(jī)制、對(duì)象關(guān)系映射機(jī)制以及用于動(dòng)態(tài)創(chuàng)建后臺(tái)管理界面的功能,利用 Django,可以快速設(shè)計(jì)和開發(fā)具有 MVC 層次的 Web 應(yīng)用。為了打消開發(fā)者選用 Django 框架時(shí)的疑慮,首先分析一下 Django 引人注目的特性。在實(shí)體映射方面,Django 的對(duì)象相關(guān)映射機(jī)制幫助開發(fā)者在 Python 類中靈活定義數(shù)據(jù)模型,并且Django 具有功能豐富的動(dòng)態(tài)數(shù)據(jù)庫訪問 API,可以大幅度簡(jiǎn)化書寫 SQL 語句的繁雜工作。同時(shí) Django 支持包括 Postgresql,MySql,Sqlite,Oracle 在內(nèi)的多種后臺(tái)數(shù)據(jù)庫。Django 的 URL 分發(fā)設(shè)計(jì)的十分簡(jiǎn)潔美觀,不會(huì)在鏈接中產(chǎn)生一大串雜亂且難以理解的字符。使用 Django 可擴(kuò)展的內(nèi)置模板,可以將模型層、控制層與頁面模板完全獨(dú)立開來進(jìn)行編碼。Django 還具有自己的 Cache 系統(tǒng),如果需要,也可以根據(jù)開發(fā)者的要求嵌套其他的 Cache 框架。
起程前的準(zhǔn)備
即使是對(duì) Python 語言還不太熟悉,Django 開發(fā)的起步過程對(duì)于新手來說也并不復(fù)雜,通過使用 Django 框架完成下面的 Web 應(yīng)用開發(fā),可以在過程的每個(gè)步驟之中體會(huì)到 Django 框架賦予開發(fā)者的敏捷與自由。
在開始之前,首先要配置好Python和Django的開發(fā)環(huán)境,下面的示例將在Windows操作系統(tǒng)下進(jìn)行,與Linux/Unix操作系統(tǒng)環(huán)境下的開發(fā)過程相比,僅在環(huán)境變量配置等方面略有不同。目前Python的***版本是2.5.1,在官方站點(diǎn)Python.org下載安裝包后搭建好Python的編譯運(yùn)行環(huán)境,接下來還需要把Python的安裝路徑添加在系統(tǒng)環(huán)境變量path里面,以便在命令行下使用Python進(jìn)行編譯及運(yùn)行。
Django目前的***發(fā)行版本是0.96版,其壓縮包可以在官方站點(diǎn)djangoproject.com下載。解壓后進(jìn)入Django目錄,在命令行里執(zhí)行python setup.py install,這樣Django就會(huì)作為第三方模塊被安裝在Python的site-packages目錄中,然后把Django中bin目錄的路徑添加到環(huán)境變量path里面,這樣在命令行里就可以方便的使用Django提供的各種指令。
開始Django的旅程
在下面的步驟里,將會(huì)利用Django框架實(shí)現(xiàn)一個(gè)完整小巧的Web應(yīng)用程序。應(yīng)用實(shí)例將創(chuàng)建實(shí)現(xiàn)一個(gè)新聞公告牌,用戶可以從后臺(tái)添加新聞分類和條目,然后在前端頁面中顯示新聞的統(tǒng)計(jì)信息。在應(yīng)用的實(shí)現(xiàn)過程中,將會(huì)逐步介紹Django的開發(fā)方式及其帶來的快捷體驗(yàn)。
為幫助開發(fā)者實(shí)現(xiàn)不同的功能,Django為我們提供了眾多的開發(fā)指令,大部分繁瑣的操作都被Django集成在簡(jiǎn)潔的命令行提示符中實(shí)現(xiàn)。現(xiàn)在打開命令提示符,進(jìn)入到想要?jiǎng)?chuàng)建應(yīng)用的目錄后鍵入django-admin.py startproject news命令,調(diào)用Django的控制臺(tái)命令新建一個(gè)名為news的工程,與此同時(shí)Django還在新創(chuàng)建的news文件夾下生成以下四個(gè)分工不同的文件。
__init__.py
文件__init__.py可以向Python編譯器表明當(dāng)前文件夾下的內(nèi)容是Python工程模塊。
2.manage.py
manage.py是Python腳本文件,與Django的命令行工具django-admin.py配合,可以對(duì)建立的工程進(jìn)行管理配置。
settings.py
這是Django工程的配置文件,與工程相關(guān)的工程模塊和數(shù)據(jù)庫全局配置信息都在settings.py中設(shè)置。
urls.py
文件urls.py負(fù)責(zé)配置URL的地址映射以及管理URL的地址格式。
當(dāng)新的工程建立好之后,假如迫不及待就想知道新建工程的模樣,Django已經(jīng)為你準(zhǔn)備好一款輕量級(jí)的Web服務(wù)器以便在開發(fā)過程中隨時(shí)測(cè)試使用。開發(fā)者只需在命令提示符下進(jìn)入工程目錄,鍵入命令manage.py runserver,就可以啟動(dòng)Web服務(wù)器來測(cè)試新建立的工程,如果啟動(dòng)沒有錯(cuò)誤,將可以看到下面這樣的提示信息:“Development server is running at http://127.0.0.1:8000/” 表示當(dāng)前工程已經(jīng)可以通過本機(jī)的8000端口訪問。通過瀏覽器打開上述地址,Django項(xiàng)目初始頁面將會(huì)出現(xiàn)在讀者面前。
在命令行里使用Ctrl+Break或Ctrl+C的組合鍵可以停止runserver命令啟動(dòng)的Web服務(wù)器。當(dāng)然,Django自帶的Web服務(wù)器一般只是在開發(fā)測(cè)試的過程中使用,當(dāng)Django工程真正發(fā)布時(shí),可以通過加載mod_python.so模塊把Django應(yīng)用部署在Apache上,以方便Web訪問的管理和配置。
Django的模型定義
在工程建立好之后,接下來就可以編寫Django的應(yīng)用模塊。鍵入命令python manage.py startapp article,命令會(huì)在當(dāng)前工程下生成一個(gè)名為article的模塊,目錄下除了標(biāo)識(shí)Python模塊的__init__.py文件,還有額外的兩個(gè)文件models.py和views.py。
在傳統(tǒng)的Web的開發(fā)中,很大的一部分工作量被消耗在數(shù)據(jù)庫中創(chuàng)建需要的數(shù)據(jù)表和設(shè)置表字段上,而Django為此提供了輕量級(jí)的解決方案。借助Django內(nèi)部的對(duì)象關(guān)系映射機(jī)制,可以用Python語言實(shí)現(xiàn)對(duì)數(shù)據(jù)庫表中的實(shí)體進(jìn)行操作,實(shí)體模型的描述需要在文件models.py中配置。
在當(dāng)前的工程中,需要有兩個(gè)Models模型,分別對(duì)應(yīng)List表和Item表,用來存儲(chǔ)新聞的分類和新聞的條目,每個(gè)Item項(xiàng)都會(huì)有一個(gè)外鍵來標(biāo)記文章的歸屬分類。下面打開Django創(chuàng)建的models.py文件,按照文件注釋中提示的模塊添加位置,編寫如下的代碼:
清單 1. models.py文件模型定義
- class List(models.Model):
- title = models.CharField(maxlength=250, unique=True)
- def __str__(self):
- return self.title
- class Meta:
- ordering = ['title']
- class Admin:
- pass
上面這段Python代碼定義了存儲(chǔ)新聞分類的List數(shù)據(jù)表,上述模型中的定義會(huì)被Django轉(zhuǎn)換成與數(shù)據(jù)庫直接交互的結(jié)構(gòu)化查詢語言來建立數(shù)據(jù)表,即創(chuàng)建一個(gè)名為List的表格,表格內(nèi)的兩個(gè)字段分別是Django自動(dòng)生成的整型主鍵id和***寬度為250個(gè)字符的VARCHAR類型字段title,并且在title字段上定義了唯一性約束,來保證新聞分類不會(huì)有完全相同的名稱。
在List類文件里還定義了函數(shù)__str__(),作用是返回self字符串表示的title字段。而在類Meta中,設(shè)置了List表格按照title字母順序的排序方式。在類Admin的設(shè)置中,允許Django針對(duì)當(dāng)前的Models模型自動(dòng)生成Django超級(jí)用戶的后臺(tái)管理入口,關(guān)鍵詞pass設(shè)定Django將按照默認(rèn)方式生成后臺(tái)管理界面。這一部分在稍后的章節(jié)可以看到,由此也可以體會(huì)到Django帶來的獨(dú)特魅力。下面再來添加新聞條目Item對(duì)應(yīng)的Models模型,代碼如下面所示:
清單 2. 添加新聞條目Models模型
- import datetime
- class Item(models.Model):
- title = models.CharField(maxlength=250)
- created_date = models.DateTimeField(default=datetime.datetime.now)
- completed = models.BooleanField(default=False)
- article_list = models.ForeignKey(List)
- def __str__(self):
- return self.title
- class Meta:
- ordering = ['-created_date', 'title']
- class Admin:
- pass
Item數(shù)據(jù)表對(duì)應(yīng)的Models代碼稍微復(fù)雜一些,但并不晦澀。代碼里首先引入datetime類型,用于定義表示文章創(chuàng)建日期的created_date字段,并且通過Python的標(biāo)準(zhǔn)函數(shù)datetime.datetime.now返回系統(tǒng)當(dāng)前日期來設(shè)置字段的默認(rèn)值。在記錄排序的ordering設(shè)置中,符號(hào)“-”表示按照日期的倒序進(jìn)行排列,如果文章創(chuàng)建日期相同,則再按照title的字母序正序排列。
到此為止,應(yīng)用中模型部分需要定義的兩個(gè)數(shù)據(jù)表都已經(jīng)創(chuàng)建完畢。
【編輯推薦】