Django3 中文教程


閱讀(1272.7k) 收藏 (153)

手冊(cè)簡(jiǎn)介

Django3 教程 Django 是一個(gè)開放源代碼的Web應(yīng)用框架,由Python寫成。

手冊(cè)說明

Django教程簡(jiǎn)介

Django是一個(gè)可以使Web開發(fā)工作愉快并且高效的Web開發(fā)框架。 使用Django,使你能夠以最小的代價(jià)構(gòu)建和維護(hù)高質(zhì)量的Web應(yīng)用。

    從好的方面來看,Web 開發(fā)激動(dòng)人心且富于創(chuàng)造性;從另一面來看,它卻是份繁瑣而令人生厭的工作。 通過減少重復(fù)的代碼,Django 使你能夠?qū)W⒂?Web 應(yīng)用上有 趣的關(guān)鍵性的東西。 為了達(dá)到這個(gè)目標(biāo),Django 提供了通用Web開發(fā)模式的高度抽象,提供了頻繁進(jìn)行的編程作業(yè)的快速解決方法,以及為“如何解決問題”提供了清晰明了的約定。 同時(shí),Django 嘗試留下一些方法,來讓你根據(jù)需要在framework之外來開發(fā)。

    本教程的目的是將你培養(yǎng)成Django專家。 主要側(cè)重于兩方面: 第一,我們深度解釋 Django 到底做了哪些工作以及如何用她構(gòu)建Web應(yīng)用;第二,我們將會(huì)在適當(dāng)?shù)牡胤接懻摳呒?jí)的概念,并解釋如何 在自己的項(xiàng)目中高效的使用這些工具。 通過閱讀此書,你將學(xué)會(huì)快速開發(fā)功能強(qiáng)大網(wǎng)站的技巧,并且你的代碼將會(huì)十分 清晰,易于維護(hù)。 本書的代碼清晰,易維護(hù),通過學(xué)習(xí),可以快速開發(fā)功能強(qiáng)大的網(wǎng)站。

    喜歡一個(gè)學(xué)習(xí)觀點(diǎn)以教促學(xué), 一直以來, 學(xué)習(xí)的時(shí)候經(jīng)常會(huì)發(fā)現(xiàn), 某個(gè)方法某個(gè)問題自己已經(jīng)明白了, 但是在教給別人的時(shí)候確說不清楚, 所以慢慢的學(xué)會(huì)了以教促學(xué)這種方法, 在教給別人知識(shí)的同時(shí)也能夠提升自己對(duì)語言, 對(duì)框架的理解.

希望達(dá)到的目標(biāo):

  • 希望能寫出一個(gè)系列文章, 我也不知道到底能寫多少
  • 能夠讓認(rèn)真閱讀這個(gè)系列的文章的人, 能在讀完之后做出一個(gè)簡(jiǎn)單的博客
  • 教會(huì)讀者使用簡(jiǎn)單的git操作和github
  • 希望能夠加深自己對(duì)Django的理解

Django是python中目前風(fēng)靡的Web Framework, 那么什么叫做Framework呢, 框架能夠幫助你把程序的整體架構(gòu)搭建好, 而我們所需要做的工作就是填寫邏輯, 而框架能夠在合適的時(shí)候調(diào)用你寫的邏輯, 而不需要我們自己去調(diào)用邏輯, 讓W(xué)eb開發(fā)變的更敏捷.

Django是一個(gè)高級(jí)Python Web框架, 鼓勵(lì)快速,簡(jiǎn)潔, 以程序設(shè)計(jì)的思想進(jìn)行開發(fā). 通過使用這個(gè)框架, 可以減少很多開發(fā)麻煩, 使你更專注于編寫自己的app, 而不需要重復(fù)造輪子. Django免費(fèi)并且開源.

Django特點(diǎn)

  • 完全免費(fèi)并開源源代碼
  • 快速高效開發(fā)
  • 使用MTV架構(gòu)(熟悉Web開發(fā)的應(yīng)該會(huì)說是MVC架構(gòu))
  • 強(qiáng)大的可擴(kuò)展性.

工作方式

用戶在瀏覽器中輸入U(xiǎn)RL后的回車, 瀏覽器會(huì)對(duì)URL進(jìn)行檢查, 首先判斷協(xié)議,如果是http就按照 Web 來處理, 然互調(diào)用DNS查詢, 將域名轉(zhuǎn)換為IP地址, 然后經(jīng)過網(wǎng)絡(luò)傳輸?shù)竭_(dá)對(duì)應(yīng)Web服務(wù)器, 服務(wù)器對(duì)url進(jìn)行解析后, 調(diào)用View中的邏輯(MTV中的V), 其中又涉及到Model(MTV中的M), 與數(shù)據(jù)庫(kù)的進(jìn)行交互, 將數(shù)據(jù)發(fā)到Template(MTV中的T)進(jìn)行渲染, 然后發(fā)送到瀏覽器中, 瀏覽器以合適的方式呈現(xiàn)給用戶

框架是什麼?

Django 在新一代的 Web框架 中非常出色,為什么這么說呢?

為回答該問題,讓我們考慮一下_不使用_框架設(shè)計(jì) Python 網(wǎng)頁應(yīng)用程序的情形。 貫穿整本書,我們多次展示不使用框架實(shí)現(xiàn)網(wǎng)站基本功能的方法,讓讀者認(rèn)識(shí)到框架開發(fā)的方便。 (不使用框架,更多情況是沒有合適的框架可用。 最重要的是,理解實(shí)現(xiàn)的來龍去脈會(huì)使你成為一個(gè)優(yōu)秀的web開發(fā)者。)

使用Python開發(fā)Web,最簡(jiǎn)單,原始和直接的辦法是使用CGI標(biāo)準(zhǔn),在1998年這種方式很流行。 現(xiàn)在從應(yīng)用角度解釋它是如何工作: 首先做一個(gè)Python腳本,輸出HTML代碼,然后保存成.cgi擴(kuò)展名的文件,通過瀏覽器訪問此文件。 就是這樣。

如下示例,用Python CGI腳本顯示數(shù)據(jù)庫(kù)中最新出版的10本書: 不用關(guān)心語法細(xì)節(jié);僅僅感覺一下基本實(shí)現(xiàn)的方法:

#!/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()

首先,用戶請(qǐng)求CGI,腳本代碼打印Content-Type行,后面跟著換行。 再接下 來是一些HTML的起始標(biāo)簽,然后連接數(shù)據(jù)庫(kù)并執(zhí)行一些查詢操作,獲取最新的十本書。 在遍歷這些書的同時(shí),生成一個(gè)書名的HTML列表項(xiàng)。 最后,輸出HTML的結(jié)束標(biāo)簽并且關(guān)閉數(shù)據(jù)庫(kù)連接。

像這樣的一次性的動(dòng)態(tài)頁面,從頭寫起的方法并非一定不好。 其中一點(diǎn): 這些代碼簡(jiǎn)單易懂,就算是一個(gè)初起步的 開發(fā)者都能讀明白這16行的Python的代碼,而且這些代碼從頭到尾做了什么都能了解得一清二楚。 不需要學(xué)習(xí)額外 的背景知識(shí),沒有額外的代碼需要去了解。 同樣,也易于部署這16行代碼,只需要將它保存為一個(gè)latestbooks.cgi 的 文件,上傳到網(wǎng)絡(luò)服務(wù)器上,通過瀏覽器訪問即可。

盡管實(shí)現(xiàn)很簡(jiǎn)單,還是暴露了一些問題和不便的地方。 問你自己這幾個(gè)問題:

  • 應(yīng)用中有多處需要連接數(shù)據(jù)庫(kù)會(huì)怎樣呢? 每個(gè)獨(dú)立的CGI腳本,不應(yīng)該重復(fù)寫數(shù)據(jù)庫(kù)連接的代碼。 比較實(shí)用的辦法是寫一個(gè)共享函數(shù),可被多個(gè)代碼調(diào)用。
  • 一個(gè)開發(fā)人員 確實(shí) 需要去關(guān)注如何輸出Content-Type以及完成所有操作后去關(guān)閉數(shù)據(jù) 庫(kù)么? 此類問題只會(huì)降低開發(fā)人員的工作效率,增加犯錯(cuò)誤的幾率。 那些初始化和釋放 相關(guān)的工作應(yīng)該交給一些通用的框架來完成。
  • 如果這樣的代碼被重用到一個(gè)復(fù)合的環(huán)境中會(huì)發(fā)生什么? 每個(gè)頁面都分別對(duì)應(yīng)獨(dú)立的數(shù)據(jù)庫(kù)和密碼嗎?
  • 如果一個(gè)Web設(shè)計(jì)師,完全沒有Python開發(fā)經(jīng)驗(yàn),但是又需要重新設(shè)計(jì)頁面的話,又將 發(fā)生什么呢? 一個(gè)字符寫錯(cuò)了,可能導(dǎo)致整個(gè)應(yīng)用崩潰。 理想的情況是,頁面顯示的邏輯與從數(shù)據(jù)庫(kù)中讀取書本記錄分隔開,這樣 Web設(shè)計(jì)師的重新設(shè)計(jì)不會(huì)影響到之前的業(yè)務(wù)邏輯。

以上正是Web框架致力于解決的問題。 Web框架為應(yīng)用程序提供了一套程序框架, 這樣你可以專注于編寫清晰、易維護(hù)的代碼,而無需從頭做起。 簡(jiǎn)單來說,這就是Django所能做的。

MVC 設(shè)計(jì)模式

讓我們來研究一個(gè)簡(jiǎn)單的例子,通過該實(shí)例,你可以分辨出,通過Web框架來實(shí)現(xiàn)的功能與之前的方式有何不同。 下面就是通過使用Django來完成以上功能的例子: 首先,我們分成4個(gè)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>

然后,不用關(guān)心語法細(xì)節(jié);只要用心感覺整體的設(shè)計(jì)。 這里只關(guān)注分割后的幾個(gè)文件:

  • models.py 文件主要用一個(gè) Python 類來描述數(shù)據(jù)表。 稱為 模型(model) 。 運(yùn)用這個(gè)類,你可以通過簡(jiǎn)單的 Python 的代碼來創(chuàng)建、檢索、更新、刪除 數(shù)據(jù)庫(kù)中的記錄而無需寫一條又一條的SQL語句。
  • views.py文件包含了頁面的業(yè)務(wù)邏輯。 latest_books()函數(shù)叫做視圖。
  • urls.py 指出了什么樣的 URL 調(diào)用什么的視圖。 在這個(gè)例子中 /latest/ URL 將會(huì)調(diào)用 latest_books()這個(gè)函數(shù)。 換句話說,如果你的域名是example.com,任何人瀏覽網(wǎng)址 http://example.com/latest/將會(huì)調(diào)用latest_books()這個(gè)函數(shù)。
  • latest_books.html 是 html 模板,它描述了這個(gè)頁面的設(shè)計(jì)是如何的。 使用帶基本邏輯聲明的模板語言,如{% for book in book_list %}

結(jié)合起來,這些部分松散遵循的模式稱為模型-視圖-控制器(MVC)。 簡(jiǎn)單的說, MVC 是一種軟件開發(fā)的方法,它把代碼的定義和數(shù)據(jù)訪問的方法(模型)與請(qǐng)求邏輯 (控制器)還有用戶接口(視圖)分開來。 我們將在第5章更深入地討論MVC。

這種設(shè)計(jì)模式關(guān)鍵的優(yōu)勢(shì)在于各種組件都是 松散結(jié)合 的。這樣,每個(gè)由 Django驅(qū)動(dòng) 的Web應(yīng)用都有著明確的目的,并且可獨(dú)立更改而不影響到其它的部分。 比如,開發(fā)者 更改一個(gè)應(yīng)用程序中的 URL 而不用影響到這個(gè)程序底層的實(shí)現(xiàn)。 設(shè)計(jì)師可以改變 HTML 頁面 的樣式而不用接觸 Python 代碼。 數(shù)據(jù)庫(kù)管理員可以重新命名數(shù)據(jù)表并且只需更改一個(gè)地方,無需從一大堆文件中進(jìn)行查找和替換。

本書中,每個(gè)組件都有它自己的一個(gè)章節(jié)。 比如,第三章涵蓋了視圖,第四章是模板, 而第五章是模型。

Django 歷史

在我們討論代碼之前我們需要先了解一下 Django 的歷史。 從上面我們注意到:我們將向你展示如何不使用捷徑來完成工作,以便能更好的理解捷徑的原理 同樣,理解Django產(chǎn)生的背景,歷史有助于理解Django的實(shí)現(xiàn)方式。

如果你曾編寫過網(wǎng)絡(luò)應(yīng)用程序。 那么你很有可能熟悉之前我們的 CGI 例子。

  1. 從頭開始編寫網(wǎng)絡(luò)應(yīng)用程序。
  2. 從頭編寫另一個(gè)網(wǎng)絡(luò)應(yīng)用程序。
  3. 從第一步中總結(jié)(找出其中通用的代碼),并運(yùn)用在第二步中。
  4. 重構(gòu)代碼使得能在第 2 個(gè)程序中使用第 1 個(gè)程序中的通用代碼。
  5. 重復(fù) 2-4 步驟若干次。
  6. 意識(shí)到你發(fā)明了一個(gè)框架。

這正是為什么 Django 建立的原因!

Django 是從真實(shí)世界的應(yīng)用中成長(zhǎng)起來的,它是由 堪薩斯(Kansas)州 Lawrence 城中的一個(gè) 網(wǎng)絡(luò)開發(fā)小組編寫的。 它誕生于 2003 年秋天,那時(shí) Lawrence Journal-World 報(bào)紙的 程序員 Adrian Holovaty 和 Simon Willison 開始用 Python 來編寫程序。

當(dāng)時(shí)他們的 World Online 小組制作并維護(hù)當(dāng)?shù)氐膸讉€(gè)新聞?wù)军c(diǎn), 并在以新聞界特有的快節(jié)奏開發(fā)環(huán)境中逐漸發(fā)展。 這些站點(diǎn)包括有 LJWorld.com、Lawrence.com 和 KUsports.com, 記者(或管理層) 要求增加的特征或整個(gè)程序都能在計(jì)劃時(shí)間內(nèi)快速的被建立,這些時(shí)間通常只有幾天 或幾個(gè)小時(shí)。 因此,Adrian 和 Simon 開發(fā)了一種節(jié)省時(shí)間的網(wǎng)絡(luò)程序開發(fā)框架, 這是在截止時(shí)間前能完成程序的唯一途徑。

2005 年的夏天,當(dāng)這個(gè)框架開發(fā)完成時(shí),它已經(jīng)用來制作了很多個(gè) World Online 的站點(diǎn)。 當(dāng)時(shí) World Online 小組中的 Jacob Kaplan-Moss 決定把這個(gè)框架發(fā)布為一個(gè)開源軟件。

從今往后數(shù)年,Django是一個(gè)有著數(shù)以萬計(jì)的用戶和貢獻(xiàn)者,在世界廣泛傳播的完善開源項(xiàng)目。 原來的World Online的兩個(gè)開發(fā)者(Adrian and Jacob)仍然掌握著Django,但是其發(fā)展方向受社區(qū)團(tuán)隊(duì)的影響更大。

這些歷史都是相關(guān)聯(lián)的,因?yàn)樗齻儙椭忉屃撕苤匾膬牲c(diǎn)。

第一,Django最可愛的地方。 Django誕生于新聞網(wǎng)站的環(huán)境中,因此它提供很多了特性(如第6章會(huì)說到的管理后臺(tái)),非常適合內(nèi)容類的網(wǎng)站,如Amazon.com, craigslist.org和washingtonpost.com,這些網(wǎng)站提供動(dòng)態(tài)的,數(shù)據(jù)庫(kù)驅(qū)動(dòng)的信息。 (不要看到這就感到沮喪,盡管Django擅長(zhǎng)于動(dòng)態(tài)內(nèi)容管理系統(tǒng), 但并不表示Django主要的目的就是用來創(chuàng)建動(dòng)態(tài)內(nèi)容的網(wǎng)站。 某些方面 特別高效 與其他方面 不高效 是有區(qū)別的, Django在其他方面也同樣高效。)

第二,Django的起源造就了它的開源社區(qū)的文化。 因?yàn)镈jango來自于真實(shí)世界中的代碼,而不是 來自于一個(gè)科研項(xiàng)目或者商業(yè)產(chǎn)品,她主要集中力量來解決Web開發(fā)中遇到的問題,同樣 也是Django的開發(fā)者經(jīng)常遇到的問題。 這樣,Django每天在現(xiàn)有的基礎(chǔ)上進(jìn)步。 框架的開發(fā)者對(duì)于讓開發(fā)人員節(jié)省時(shí)間,編寫更加容易維護(hù)的程序,同時(shí)保證程序運(yùn)行的效率具有極大的興趣。 無他,開發(fā)者動(dòng)力來源于自己的目標(biāo):節(jié)省時(shí)間,快樂工作。 (坦率地講,他們使用了自己公司的產(chǎn)品。)

如何閱讀本書

在編寫本書時(shí),我們努力嘗試在可讀性和參考性間做一個(gè)平衡,當(dāng)然本書會(huì)偏向于可 讀性。 本書的目標(biāo),之前也提過,是要將你培養(yǎng)成一名Django專家,我們相信,最好 的方式就是提供文章和充足的實(shí)例,而不是一堆詳盡卻乏味的關(guān)于Django特色的手冊(cè)。 (曾經(jīng)有人說過,如果僅僅教字母表是無法教會(huì)別人說話的。

按照這種思路,我們推薦的就是按順序閱讀,從基礎(chǔ)開始了解Django的獨(dú)特之處,等全部都閱讀完之后,就可以任意順序閱讀。

要回憶語法或查閱 Django 某部分的功能概要時(shí),你偶爾可能會(huì)回來翻翻這些資料以及  http://www.djangoproject.com/ 上的免費(fèi)文檔。

所需編程知識(shí)

本書讀者需要理解基本的面向過程和面向?qū)ο缶幊蹋?流程控制( if , while 和 for ),數(shù)據(jù)結(jié)構(gòu)(列表,哈希表/字典),變量,類和對(duì)象。

Web開發(fā)經(jīng)驗(yàn),正如你所想的,也是非常有幫助的,但是對(duì)于閱讀本書,并不是必須的。 通過本書,我們盡量給缺乏經(jīng)驗(yàn)的開發(fā)人員提供在Web開發(fā)中最好的實(shí)踐。

Python所需知識(shí)

本質(zhì)上來說, Django 只不過是用 Python 編寫的一組類庫(kù)。 用 Django 開發(fā)站點(diǎn)就是使用這些類庫(kù)編寫 Python 代碼。 因此,學(xué)習(xí) Django 的關(guān)鍵就是學(xué)習(xí)如何進(jìn)行 Python 編程并理解 Django 類庫(kù)的運(yùn)作方式。

如果你有Python開發(fā)經(jīng)驗(yàn),在學(xué)習(xí)過程中應(yīng)該不會(huì)有任何問題。 基本上,Django的代碼并 沒有使用一些黑色魔法(例如代碼中的花哨技巧,某個(gè)實(shí)現(xiàn)解釋或者理解起來十分困難)。 對(duì)你來說,學(xué)習(xí)Django就是學(xué)習(xí)她的命名規(guī)則和API。

如果你沒有使用 Python 編程的經(jīng)驗(yàn),你一定會(huì)學(xué)到很多東西。 它是非常易學(xué)易用的。 雖然這本書沒有包括一個(gè)完整的 Python 教程, 但也算是一個(gè)恰當(dāng)?shù)慕榻B了 Python特征和 功能的集錦。 當(dāng)然,我們推薦你讀一下官方的 Python 教程,它可 以從  http://docs.python.org/tut/ 在線獲得。 另外我們也推薦 Mark Pilgrims的 書Dive Into Python (  http://www.diveintopython.org/ )

Django版本支持

此書內(nèi)容對(duì)Django 3.0兼容。

學(xué)習(xí)本教程前你需要了解一些基礎(chǔ)的Web知識(shí)及Python基礎(chǔ)教程。

Django 版本與 Python 環(huán)境的對(duì)應(yīng)表:

 Django 版本  Python 版本
                                                     1.5                                                      2.6.5, 2.7, 3.2, 3.3.
 1.6  2.6, 2.7, 3.2, 3.3
 1.7  2.7, 3.2, 3.3, 3.4 (2.6 不支持了)
 1.8 LTS  2.7, 3.2, 3.3, 3.4, 3.5 (長(zhǎng)期支持版本 LTS)
 1.9  2.7, 3.4, 3.5 (3.3 不支持了)
 1.10  2.7, 3.4, 3.5
 1.11 LTS  2.7, 3.4, 3.5, 3.6 (最后一個(gè)支持 Python 2.7 的版本 )
 2.0  3.4, 3.5, 3.6 (注意,不再支持 Python 2)
 2.1  3.5, 3.6, 3.7
 2.2 LTS  3.5, 3.6, 3.7
 3.0  3.6, 3.7, 3.8

獲取幫助

Django的最大的益處是,有一群樂于助人的人在Django社區(qū)上。 你可以毫無約束的提各種 問題在上面,如:django的安裝,app 設(shè)計(jì),db 設(shè)計(jì),發(fā)布。

  • Django郵件列表是很多Django用戶提出問題、回答問題的地方。 可以通過 http://www.djangoproject.com/r/django-users 來免費(fèi)注冊(cè)。
  • 如果Django用戶遇到棘手的問題,希望得到及時(shí)地回復(fù),可以使用Django IRC channel。 在Freenode IRC network加入#django

最后,本教程希望通過文字和圖的結(jié)合讓讀者能夠初步理解Django的工作方式。


領(lǐng)取免費(fèi)資料

掃描下方二維碼或打開微信搜一搜“w3cschool編程獅”關(guān)注公眾號(hào)回復(fù)關(guān)鍵詞【Python123】或者【Python資料包】免費(fèi)領(lǐng)取 Python 學(xué)習(xí)資料,包含軟件安裝包,思維導(dǎo)圖等

w3cschool編程獅微信公眾號(hào)


在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)