本書所講的是Django:一個可使Web開發工做愉快而且高效的Web開發框架。 使用Django,使你可以以最小的代價構建和維護高質量的Web應用。html
從好的方面來看,Web 開發激動人心且富於創造性;從另外一面來看,它倒是份繁瑣而使人生厭的工做。 經過減小重複的代碼,Django 使你可以專一於 Web 應用上有 趣的關鍵性的東西。 爲了達到這個目標,Django 提供了通用Web開發模式的高度抽象,提供了頻繁進行的編程做業的快速解決方法,以及爲「如何解決問題」提供了清晰明瞭的約定。 同時,Django 嘗試留下一些方法,來讓你根據須要在framework以外來開發。node
本書的目的是將你培養成Django專家。 主要側重於兩方面: 第一,咱們深度解釋 Django 到底作了哪些工做以及如何用她構建Web應用;第二,咱們將會在適當的地方討論更高級的概念,並解釋如何 在本身的項目中高效的使用這些工具。 經過閱讀此書,你將學會快速開發功能強大網站的技巧,而且你的代碼將會十分 清晰,易於維護。 本書的代碼清晰,易維護,經過學習,能夠快速開發功能強大的網站。python
Django 在新一代的 Web框架 中很是出色,爲何這麼說呢?程序員
爲回答該問題,讓咱們考慮一下不使用框架設計 Python 網頁應用程序的情形。 貫穿整本書,咱們屢次展現不使用框架實現網站基本功能的方法,讓讀者認識到框架開發的方便。 (不使用框架,更多狀況是沒有合適的框架可用。 最重要的是,理解實現的前因後果會使你成爲一個優秀的web開發者。)web
使用Python開發Web,最簡單,原始和直接的辦法是使用CGI標準,在1998年這種方式很流行。 如今從應用角度解釋它是如何工做: 首先作一個Python腳本,輸出HTML代碼,而後保存成.cgi擴展名的文件,經過瀏覽器訪問此文件。 就是這樣。數據庫
以下示例,用Python CGI腳本顯示數據庫中最新出版的10本書: 不用關心語法細節;僅僅感受一下基本實現的方法:django
#!/usr/bin/env python import MySQLdb print "Content-Type: text/html\n" print "<html><head><title>Books</title></head>" print "<body>" print "<h1>Books</h1>" print "<ul>" connection = MySQLdb.connect(user='me', passwd='letmein', db='my_db') cursor = connection.cursor() cursor.execute("SELECT name FROM books ORDER BY pub_date DESC LIMIT 10") for row in cursor.fetchall(): print "<li>%s</li>" % row[0] print "</ul>" print "</body></html>" connection.close()
首先,用戶請求CGI,腳本代碼打印Content-Type行,後面跟着換行。 再接下 來是一些HTML的起始標籤,而後鏈接數據庫並執行一些查詢操做,獲取最新的十本書。 在遍歷這些書的同時,生成一個書名的HTML列表項。 最後,輸出HTML的結束標籤而且關閉數據庫鏈接。編程
像這樣的一次性的動態頁面,從頭寫起的方法並不是必定很差。 其中一點: 這些代碼簡單易懂,就算是一個初起步的 開發者都能讀明白這16行的Python的代碼,並且這些代碼從頭至尾作了什麼都能瞭解得一清二楚。 不須要學習額外 的背景知識,沒有額外的代碼須要去了解。 一樣,也易於部署這16行代碼,只須要將它保存爲一個 latestbooks.cgi
的 文件,上傳到網絡服務器上,經過瀏覽器訪問便可。設計模式
儘管實現很簡單,仍是暴露了一些問題和不便的地方。 問你本身這幾個問題:瀏覽器
應用中有多處須要鏈接數據庫會怎樣呢? 每一個獨立的CGI腳本,不該該重複寫數據庫鏈接的代碼。 比較實用的辦法是寫一個共享函數,可被多個代碼調用。
一個開發人員 確實 須要去關注如何輸出Content-Type以及完成全部操做後去關閉數據 庫麼? 此類問題只會下降開發人員的工做效率,增長犯錯誤的概率。 那些初始化和釋放 相關的工做應該交給一些通用的框架來完成。
若是這樣的代碼被重用到一個複合的環境中會發生什麼? 每一個頁面都分別對應獨立的數據庫和密碼嗎?
若是一個Web設計師,徹底沒有Python開發經驗,可是又須要從新設計頁面的話,又將 發生什麼呢? 一個字符寫錯了,可能致使整個應用崩潰。 理想的狀況是,頁面顯示的邏輯與從數據庫中讀取書本記錄分隔開,這樣 Web設計師的從新設計不會影響到以前的業務邏輯。
以上正是Web框架致力於解決的問題。 Web框架爲應用程序提供了一套程序框架, 這樣你能夠專一於編寫清晰、易維護的代碼,而無需從頭作起。 簡單來講,這就是Django所能作的。
讓咱們來研究一個簡單的例子,經過該實例,你能夠分辨出,經過Web框架來實現的功能與以前的方式有何不一樣。 下面就是經過使用Django來完成以上功能的例子: 首先,咱們分紅4個Python的文件,(models.py
, views.py
, urls.py
) 和html模板文件 (latest_books.html
)
# models.py (the database tables) from django.db import models class Book(models.Model): name = models.CharField(max_length=50) pub_date = models.DateField() # views.py (the business logic) from django.shortcuts import render_to_response from models import Book def latest_books(request): book_list = Book.objects.order_by('-pub_date')[:10] return render_to_response('latest._books.html', {'book_list': book_list}) # urls.py (the URL configuration) from django.conf.urls.defaults import * import views urlpatterns = patterns('', (r'^latest/$', views.latest_books), ) # latest_books.html (the template) <html><head><title>Books</title></head> <body> <h1>Books</h1> <ul> {% for book in book_list %} <li>{{ book.name }}</li> {% endfor %} </ul> </body></html>
而後,不用關心語法細節;只要用心感受總體的設計。 這裏只關注分割後的幾個文件:
models.py
文件主要用一個 Python 類來描述數據表。 稱爲 模型(model) 。 運用這個類,你能夠經過簡單的 Python 的代碼來建立、檢索、更新、刪除 數據庫中的記錄而無需寫一條又一條的SQL語句。
views.py文件包含了頁面的業務邏輯。 latest_books()
函數叫作視圖。
urls.py
指出了什麼樣的 URL 調用什麼的視圖。 在這個例子中 /latest/
URL 將會調用 latest_books()
這個函數。 換句話說,若是你的域名是example.com,任何人瀏覽網址http://example.com/latest/將會調用latest_books()
這個函數。
latest_books.html
是 html 模板,它描述了這個頁面的設計是如何的。 使用帶基本邏輯聲明的模板語言,如{% for book in book_list %}
結合起來,這些部分鬆散遵循的模式稱爲模型-視圖-控制器(MVC)。 簡單的說, MVC 是一種軟件開發的方法,它把代碼的定義和數據訪問的方法(模型)與請求邏輯 (控制器)還有用戶接口(視圖)分開來。 咱們將在第5章更深刻地討論MVC。
這種設計模式關鍵的優點在於各類組件都是 鬆散結合 的。這樣,每一個由 Django驅動 的Web應用都有着明確的目的,而且可獨立更改而不影響到其它的部分。 好比,開發者 更改一個應用程序中的 URL 而不用影響到這個程序底層的實現。 設計師能夠改變 HTML 頁面 的樣式而不用接觸 Python 代碼。 數據庫管理員能夠從新命名數據表而且只需更改一個地方,無需從一大堆文件中進行查找和替換。
本書中,每一個組件都有它本身的一個章節。 好比,第三章涵蓋了視圖,第四章是模板, 而第五章是模型。
在咱們討論代碼以前咱們須要先了解一下 Django 的歷史。 從上面咱們注意到:咱們將向你展現如何不使用捷徑來完成工做,以便能更好的理解捷徑的原理 一樣,理解Django產生的背景,歷史有助於理解Django的實現方式。
若是你曾編寫過網絡應用程序。 那麼你頗有可能熟悉以前咱們的 CGI 例子。
從頭開始編寫網絡應用程序。
從頭編寫另外一個網絡應用程序。
從第一步中總結(找出其中通用的代碼),並運用在第二步中。
重構代碼使得能在第 2 個程序中使用第 1 個程序中的通用代碼。
重複 2-4 步驟若干次。
意識到你發明了一個框架。
這正是爲何 Django 創建的緣由!
Django 是從真實世界的應用中成長起來的,它是由 堪薩斯(Kansas)州 Lawrence 城中的一個 網絡開發小組編寫的。 它誕生於 2003 年秋天,那時 Lawrence Journal-World 報紙的 程序員 Adrian Holovaty 和 Simon Willison 開始用 Python 來編寫程序。
當時他們的 World Online 小組製做並維護當地的幾個新聞站點, 並在以新聞界特有的快節奏開發環境中逐漸發展。 這些站點包括有 LJWorld.com、Lawrence.com 和 KUsports.com, 記者(或管理層) 要求增長的特徵或整個程序都能在計劃時間內快速的被創建,這些時間一般只有幾天 或幾個小時。 所以,Adrian 和 Simon 開發了一種節省時間的網絡程序開發框架, 這是在截止時間前能完成程序的惟一途徑。
2005 年的夏天,當這個框架開發完成時,它已經用來製做了不少個 World Online 的站點。 當時 World Online 小組中的 Jacob Kaplan-Moss 決定把這個框架發佈爲一個開源軟件。
從今日後數年,Django是一個有着數以萬計的用戶和貢獻者,在世界普遍傳播的完善開源項目。 原來的World Online的兩個開發者(Adrian and Jacob)仍然掌握着Django,可是其發展方向受社區團隊的影響更大。
這些歷史都是相關聯的,由於她們幫助解釋了很重要的兩點。 第一,Django最可愛的地方。 Django誕生於新聞網站的環境中,所以它提供不少了特性(如第6章會說到的管理後臺),很是適合內容類的網站,如Amazon.com, craigslist.org和washingtonpost.com,這些網站提供動態的,數據庫驅動的信息。 (不要看到這就感到沮喪,儘管Django擅長於動態內容管理系統, 但並不表示Django主要的目的就是用來建立動態內容的網站。 某些方面 * 特別高效* 與其餘方面 * 不高效* 是有區別的, Django在其餘方面也一樣高效。)
第二,Django的起源造就了它的開源社區的文化。 由於Django來自於真實世界中的代碼,而不是 來自於一個科研項目或者商業產品,她主要集中力量來解決Web開發中遇到的問題,一樣 也是Django的開發者常常遇到的問題。 這樣,Django天天在現有的基礎上進步。 框架的開發者對於讓開發人員節省時間,編寫更加容易維護的程序,同時保證程序運行的效率具備極大的興趣。 無他,開發者動力來源於本身的目標:節省時間,快樂工做。 (坦率地講,他們使用了本身公司的產品。)
在編寫本書時,咱們努力嘗試在可讀性和參考性間作一個平衡,固然本書會偏向於可 讀性。 本書的目標,以前也提過,是要將你培養成一名Django專家,咱們相信,最好 的方式就是提供文章和充足的實例,而不是一堆詳盡卻乏味的關於Django特點的手冊。 (曾經有人說過,若是僅僅教字母表是沒法教會別人說話的。
按照這種思路,咱們推薦按順序閱讀第 1-12 章。 這些章節構成了如何使用 Django 的基礎;讀過以後,你就能夠搭建由 Django 支撐的網站了。 1-7章是核心課程,8-11章講述Django的高級應用,12章講述部署相關的知識。 剩下的13-20章,講述Django特有的特色,能夠任意順序閱讀。
附錄部分用做參考資料。 要回憶語法或查閱 Django 某部分的功能概要時,你偶爾可能會回來翻翻這些資料以及 http://www.djangoproject.com/ 上的免費文檔。
本書讀者須要理解基本的面向過程和麪向對象編程: 流程控制( if
, while
和 for
),數據結構(列表,哈希表/字典),變量,類和對象。
Web開發經驗,正如你所想的,也是很是有幫助的,可是對於閱讀本書,並非必須的。 經過本書,咱們儘可能給缺少經驗的開發人員提供在Web開發中最好的實踐。
本質上來講, Django 只不過是用 Python 編寫的一組類庫。 用 Django 開發站點就是使用這些類庫編寫 Python 代碼。 所以,學習 Django 的關鍵就是學習如何進行 Python 編程並理解 Django 類庫的運做方式。
若是你有Python開發經驗,在學習過程當中應該不會有任何問題。 基本上,Django的代碼並 沒有使用一些黑色魔法(例如代碼中的花哨技巧,某個實現解釋或者理解起來十分困難)。 對你來講,學習Django就是學習她的命名規則和API。
若是你沒有使用 Python 編程的經驗,你必定會學到不少東西。 它是很是易學易用的。 雖然這本書沒有包括一個完整的 Python 教程, 但也算是一個恰當的介紹了 Python特徵和 功能的集錦。 固然,咱們推薦你讀一下官方的 Python 教程,它可 以從 http://docs.python.org/tut/ 在線得到。 另外咱們也推薦 Mark Pilgrims的 書 Dive Into Python ( http://www.diveintopython.org/ )
此書內容對Django 1.1兼容。
Django的開發者保證主要版本號向後兼容。 這意味着,你用Django 1.1寫的應用,能夠用於1.2,1.3,1.9等全部以1開頭的版本
若是Django到了2.0,你的應用可能再也不兼容,須要重寫,可是,2.0是很遙遠的事情。 對此,能夠參考一下1.0的開發週期,整整3年的時間。 (這與Python語言的兼容策略很是像: 在python 2.0下寫的代碼能夠在python 2.6下運行,但不必定能在python3.0下運行
因此,此書覆蓋1.1版本,可使用很長時間。
Django的最大的益處是,有一羣樂於助人的人在Django社區上。 你能夠毫無約束的提各類 問題在上面,如:django的安裝,app 設計,db 設計,發佈。
Django郵件列表是不少Django用戶提出問題、回答問題的地方。 能夠經過http://www.djangoproject.com/r/django-users 來免費註冊。
若是Django用戶遇到棘手的問題,但願獲得及時地回覆,可使用Django IRC channel。 在Freenode IRC network加入#django