開始你的第一個Django應(yīng)用(part 1)

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ù)哗咆,regexview是必須的,kwargsname是可選的益眉。我大概介紹一下他們的作用晌柬。

  1. regex參數(shù)

regexregular 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ù)傳遞泉褐。稍后會給出例子解釋赐写。

  1. 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)的知識。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末狂丝,一起剝皮案震驚了整個濱河市换淆,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌几颜,老刑警劉巖倍试,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蛋哭,居然都是意外死亡县习,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進(jìn)店門谆趾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來躁愿,“玉大人,你說我怎么就攤上這事沪蓬⊥樱” “怎么了?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵怜跑,是天一觀的道長样勃。 經(jīng)常有香客問我吠勘,道長,這世上最難降的妖魔是什么峡眶? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任剧防,我火速辦了婚禮,結(jié)果婚禮上辫樱,老公的妹妹穿的比我還像新娘峭拘。我一直安慰自己,他們只是感情好狮暑,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布鸡挠。 她就那樣靜靜地躺著,像睡著了一般搬男。 火紅的嫁衣襯著肌膚如雪拣展。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天缔逛,我揣著相機(jī)與錄音备埃,去河邊找鬼。 笑死褐奴,一個胖子當(dāng)著我的面吹牛按脚,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播敦冬,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼辅搬,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了脖旱?” 一聲冷哼從身側(cè)響起堪遂,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎夯缺,沒想到半個月后蚤氏,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡踊兜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了佳恬。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片捏境。...
    茶點(diǎn)故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖毁葱,靈堂內(nèi)的尸體忽然破棺而出垫言,到底是詐尸還是另有隱情,我是刑警寧澤倾剿,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布筷频,位于F島的核電站蚌成,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏凛捏。R本人自食惡果不足惜担忧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望坯癣。 院中可真熱鬧瓶盛,春花似錦、人聲如沸示罗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蚜点。三九已至轧房,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間绍绘,已是汗流浹背奶镶。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留脯倒,地道東北人实辑。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像藻丢,于是被迫代替她去往敵國和親剪撬。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評論 2 355

推薦閱讀更多精彩內(nèi)容