Django1.11版本的官方教程翻譯席赂。
讓我們一起通過一個例子學(xué)習(xí)Django吮铭。
通過這個教程,我會帶著你們手把手教你完成一個基礎(chǔ)的民意調(diào)查web應(yīng)用颅停。
這個應(yīng)用包括兩個部分:
- 一個公共站點(diǎn)谓晌,讓人們?yōu)g覽投票情況,并投出自己的一票
- 一個管理站點(diǎn)癞揉,讓你添加纸肉,修改,刪除投票
我們假設(shè)你已經(jīng)安裝好了Django喊熟。你可以在通過一條命令行指令看看自己是否已經(jīng)安裝Django以及是什么版本的Django柏肪。
python -m django --version
如果Django已經(jīng)安裝,你會看到你安裝的版本的版本號芥牌。如果沒有烦味,你會得到一條警告寫到"No module named django"。
這個教程基于Django 1.11和Python 3.4及以后壁拉。如果Django版本不匹配谬俄,你可以去官方網(wǎng)站查看你的版本的對應(yīng)教程,或者把你的Django更新到最新版本(譯者注:1.11應(yīng)該是Django1.x版本的最后一個長期支持版本)弃理。如果你還在使用Python 2.7溃论,你得稍微修改修改教程內(nèi)的代碼。(譯者注:Python 3.x已經(jīng)是主流了痘昌,并且一定是日后的主流钥勋,盡早使用沒毛病。)
關(guān)于安裝和更新Django請查看如何安裝Django辆苔。
創(chuàng)建你的第一個項(xiàng)目
如果這是你第一次使用Django算灸,你得注意一些開始步驟。也就是說姑子,你需要自動運(yùn)行一些用來創(chuàng)建Django項(xiàng)目的代碼乎婿,一個Django示例的設(shè)置合集,包括database configuration(數(shù)據(jù)庫配置)街佑,Django-specific Options(Django選項(xiàng))和application-specific settings(應(yīng)用設(shè)置)谢翎。
從命令行使用cd
進(jìn)入你想要保存你的代碼的目錄捍靠,然后運(yùn)行以下命令:
django-admin startproject mysite
這條命令會在當(dāng)前目錄中創(chuàng)建一個mysite目錄。如果這沒有用森逮,請查看使用Django的那些問題榨婆。
注意:你不能使用一些Python和Django內(nèi)置的元素名來命名你的Django項(xiàng)目。比如你不應(yīng)該使用像Django或者test這樣的名字來命名自己的項(xiàng)目褒侧。
這個代碼應(yīng)該放在哪良风?
把任何Python代碼放在你的Web服務(wù)器的文檔根目錄里都并不是一個明智的做法,因?yàn)橛锌赡軙寗e人通過網(wǎng)絡(luò)看到你的代碼闷供,這不太安全烟央。
把,你的代碼放在根目錄之外歪脏,比如/home/mycode
來疑俭,我們看看剛剛的startproject
創(chuàng)建了什么?
mysite/ manage.py mysite/ __init__.py settings.py urls.py wsgi.py
-最外面的mysite/
根目錄只是一個項(xiàng)目的容器婿失,Django對這個名字并不在乎钞艇,你可以隨便改名字。
-manage.py
:一個命令行程序豪硅,幫助你通過各種方式和Django交互哩照。你可以去Django-admin和manage.py查看所有的相關(guān)細(xì)節(jié)。
-里面的mysite/
目錄是你項(xiàng)目真正的Python包懒浮。你會需要用這個名字來import里面的東西飘弧。(比如 mysite.urls)
-mysite/__init__.py
:一個空的文件,告訴Python這整個目錄應(yīng)該被看做一個Python包嵌溢,如果你對Python也是個新手眯牧,可以去查看Python官方文檔。
-mysite/settings.py
:關(guān)于這個Django項(xiàng)目的配置赖草⊙伲可以點(diǎn)擊后面的鏈接查看細(xì)節(jié)。Django settings
-mysite/urls.py
:這個Django項(xiàng)目的URL聲明秧骑。一個你的Django站點(diǎn)的目錄版确。你可以查看官方文檔查看更多細(xì)節(jié)URL dispatcher
-mysite/wsgi.py
:WSGI兼容的Web服務(wù)器為您的項(xiàng)目提供服務(wù)的入門點(diǎn)。有關(guān)詳細(xì)信息乎折,請參閱如何使用WSGI進(jìn)行部署绒疗。
開發(fā)服務(wù)器
來,我們檢驗(yàn)一下自己的Django項(xiàng)目骂澄。進(jìn)入自己的mysite
目錄了吓蘑,然后輸入一下命令行命令:
python manage.py runserver
你會看到命令行輸出下面的信息:
Performing system checks... System check identified no issues (0 silenced). You have unapplied migrations; your app may not work properly until they are applied.Run 'python manage.py migrate' to apply them. April 04, 2017 - 15:50:53Django version 1.11, using settings 'mysite.settings'Starting development server at [http://127.0.0.1:8000/](http://127.0.0.1:8000/)Quit the server with CONTROL-C.
現(xiàn)在你已經(jīng)啟動了Django的開發(fā)服務(wù)器,一個完全用python寫成的輕量級Web服務(wù)器。我們將這個服務(wù)器包括在Django內(nèi)磨镶,開發(fā)者就不用費(fèi)功夫去調(diào)試一個像Apache那樣的服務(wù)器了溃蔫。這樣來幫助開發(fā)者快速開發(fā)。
現(xiàn)在琳猫,我必須提醒一下大家:不要在任何類似生產(chǎn)環(huán)境中使用這個服務(wù)器伟叛。這個服務(wù)器只用于開發(fā)(官方注:我們只是搞Web框架開發(fā)的,不是搞Web服務(wù)器開發(fā)的脐嫂。)
現(xiàn)在统刮,服務(wù)器已經(jīng)運(yùn)行了。通過你的瀏覽器訪問http://127.0.0.1:8000/账千。
你會看到一個舒服的淺藍(lán)色的Django歡迎頁面侥蒙。我們成功了!
更換借口
默認(rèn)情況下蕊爵,會在內(nèi)部IP的8000端口啟動開發(fā)服務(wù)器辉哥。
如果你想更換服務(wù)器端口桦山,請通過命令行傳遞參數(shù)攒射。比如使用8080端口
python manage.py runserver 8080
如果你想改變服務(wù)器IP,請將其和端口一起傳遞恒水。例如会放,要監(jiān)聽所有可用的公共IP(如果你在使用Vagrant或者想炫耀你的工作),請使用:
python manage.py runserver 0:8000
0是0.0.0.0的快捷方式钉凌。開發(fā)服務(wù)器的完整文檔可以在runserver參考中找到咧最。
自動重新加載服務(wù)器
開發(fā)服務(wù)器根據(jù)需要自動為每個請求重新加載Python代碼。你不需要重新啟動服務(wù)器以使代碼更改生效御雕。但是矢沿,一些操作(如添加文件)不會觸發(fā)重新啟動,因此在這些情況下您必須重新啟動服務(wù)器酸纲。
創(chuàng)建投票Web應(yīng)用
現(xiàn)在捣鲸,你的環(huán)境 - 一個“項(xiàng)目” - 已經(jīng)建立起來,你已經(jīng)可以真正開始工作了闽坡。
你在Django中編寫的每個應(yīng)用程序都包含了一個遵循一定約定的Python包栽惶。 Django自帶一個實(shí)用程序,可以幫助你自動生成應(yīng)用程序的基本目錄結(jié)構(gòu)疾嗅,因此您可以專注于編寫代碼而不是不停的創(chuàng)建目錄外厂。
項(xiàng)目project和應(yīng)用App?
這兩個的區(qū)別是什么代承?
一個app是一個用于實(shí)現(xiàn)某個功能的Web應(yīng)用汁蝶,比如,一個網(wǎng)絡(luò)博客系統(tǒng)论悴,一個公共記錄數(shù)據(jù)庫掖棉,或是一個簡單的投票應(yīng)用席爽。
一個project是為了一個網(wǎng)站的一系列的配置和應(yīng)用的集合。
一個project可以保護(hù)多個app啊片。
一個app可以存在于多個project里只锻。
你的應(yīng)用程序可以存在于Python路徑的任何位置。在本教程中紫谷,我們會在manage.py的旁邊建立這個投票應(yīng)用齐饮,這樣它就可以作為這個項(xiàng)目的頂級模塊,而不是一個簡單的子模塊笤昨。
為了創(chuàng)建app祖驱,請確保你在manage.py的目錄里,然后輸入以下命令
python manage.py startapp polls
然后我們就成功創(chuàng)建了一個目錄瞒窒,叫做polls捺僻。
目錄的結(jié)構(gòu)是這樣的:
polls/ __init__.py admin.py apps.py migrations/ __init__.py models.py tests.py views.py
這個目錄就會存放我們的投票應(yīng)用。
完成你的第一個視圖view
現(xiàn)在讓我們一起寫我們的第一個視圖view崇裁。打開polls/views.py
這個文件匕坯,然后寫入下面的Python代碼。
from django.http import HttpResponse
def index(request): return HttpResponse("Hello, world. You're at the polls index.")
這應(yīng)該是Django中最簡單的視圖了拔稳。為了調(diào)用它葛峻,我們需要將它映射到一個URL,因此我們需要一個URLconf巴比。
我們應(yīng)該在polls
目錄中創(chuàng)建一個叫做urls.py
的文件术奖。
在這個文件中應(yīng)該包含以下代碼:
from django.conf.urls import url
from . import views
urlpatterns = [ url(r'^$', views.index, name='index'), ]
下一步,我們應(yīng)該將根URLconf指向我們的polls.urls
模塊轻绞。在mysite/urls.py
中采记,加入django.conf.urls.include
,并且將我們的polls.urls
加入urlpatterns
政勃。
你的urls.py
應(yīng)該是這樣的:
from django.conf.urls import include, url from django.contrib import admin
urlpatterns = [ url(r'^polls/', include('polls.urls')), url(r'^admin/', admin.site.urls), ]
include()
函數(shù)允許引用其他URLconf唧龄。請注意,include()
函數(shù)的正則表達(dá)式不具有$(字符串結(jié)尾匹配字符)稼病,而是尾部斜線选侨。每當(dāng)Django遇到include()
時,它會排除與該點(diǎn)匹配的任何部分然走,并將剩余的字符串發(fā)送到包含的URLconf進(jìn)行進(jìn)一步處理援制。
include()
的背后的想法是URL可以即插即用。由于民意調(diào)查是在自己的URLconf(polls / urls.py
)中芍瑞,它們可以放在“/ polls /”下或“/ fun_polls /”下或“/ content / polls /”或其他路徑根目錄下晨仑,應(yīng)用程序仍然可以工作。
什么時候使用include()
當(dāng)你想要導(dǎo)入其他的URL時,請使用include()洪己。admin.site.urls
是唯一的例外妥凳。
你看到的和教程里的不太一樣?
如果你在你的文件里看到了include(admin.site.urls)
而不是admin.site.urls
應(yīng)該是你使用了的Django版本不是1.11答捕,而是其他的逝钥。
你已經(jīng)將索引視圖連接到了URLconf中。讓我們來檢驗(yàn)一下工作吧拱镐。輸入以下命令行命令艘款。
python manage.py runserver
用你的瀏覽器去 http://localhost.8000/polls/ ,然后你應(yīng)該會看到
“Hello, world. You’re at the polls index.”
這是你的index view里定義的沃琅。
url()
函數(shù)傳遞四個參數(shù)哗咆,regex
和view
是必須的,kwargs
和name
是可選的益眉。我大概介紹一下他們的作用晌柬。
-
regex
參數(shù)
regex
是regular expression(正則表達(dá)式)
的常用的簡寫。它是用于匹配字符串中的模式的語法郭脂,或者在這個例子中年碘,用來匹配url的模式。Django從第一個正則表達(dá)式開始朱庆,并將其放在列表中盛泡,將請求的URL和每一個正則表達(dá)式比對,選出匹配的娱颊。
請注意,這些正則表達(dá)式不搜索GET和POST參數(shù)或域名凯砍。例如箱硕,在https://www.example.com/myapp/
的請求中,URLconf將尋找myapp/
悟衩。在https://www.example.com/myapp/?page=3
的請求中剧罩,URLconf還將查找myapp/
。
如果不太明白正則表達(dá)式座泳,請參閱維基百科的條目或者re模塊的文檔惠昔。此外O’Reilly系列書中的《掌握正則表達(dá)式》也非常棒。實(shí)際操作中挑势,你并不需要成為正則表達(dá)式的專家镇防,因?yàn)槟恍枰廊绾尾东@簡單的模式。實(shí)際上潮饱,復(fù)雜的正則表達(dá)式的查找性能會很差来氧,所以你可能不應(yīng)該依靠正則表達(dá)式的全部功能。
最后,一個有關(guān)性能的說明:這些正則表達(dá)式是第一次加載URLconf模塊時會被編譯啦扬。因此它們超級快(只要查找不是太復(fù)雜)中狂。
2.view
參數(shù)
當(dāng)Django找到了一個正則表達(dá)式進(jìn)行匹配時,Django會調(diào)用指定的視圖函數(shù)扑毡,使用HttpRequest
作為第一個參數(shù)胃榕,并且將正則表達(dá)式中捕獲的值作為其他參數(shù)。如果正則表達(dá)式 使用簡單的捕獲值瞄摊,則值作為位置參數(shù)傳遞勤晚;如果使用命名捕獲,則值作為關(guān)鍵字參數(shù)傳遞泉褐。稍后會給出例子解釋赐写。
-
kwargs
參數(shù)
任意關(guān)鍵詞參數(shù)(keyword arguments)可以在字典中傳遞到目標(biāo)視圖。我們不會在教程中使用Django的這個功能膜赃。
4.name
參數(shù)
命名你的URL挺邀,方便你在Django的其他地方明確的引用他,特別是模版中跳座。這個強(qiáng)大的功能可以讓你全面更改項(xiàng)目的URL模式端铛,而且只接觸一個文件。
如果這章基本明白了疲眷,請開始本教程的第二部分禾蚕,開始學(xué)習(xí)數(shù)據(jù)庫相關(guān)的知識。