Part1 創(chuàng)建第一個(gè)Django應(yīng)用

開始寫第一個(gè)Django app

通過一個(gè)簡(jiǎn)單的例子來(lái)學(xué)習(xí)檐薯,這篇教程是通過學(xué)習(xí)一個(gè)投票應(yīng)用的創(chuàng)建來(lái)學(xué)習(xí)Django。包含兩個(gè)部分:

  • 一個(gè)可以讓人投票的公共站點(diǎn)
  • 一個(gè)管理站點(diǎn),可以用來(lái)添加做个、修改和刪除投票。

我們假設(shè)你現(xiàn)在已經(jīng)安裝好了Django滚局,可以在一個(gè)shell窗口運(yùn)行下面這個(gè)命令來(lái)驗(yàn)證:
python -m django --version
如果安裝了Django居暖,可以看到Django的版本信息,如果沒有安裝會(huì)有一個(gè)錯(cuò)誤提示:No module named django藤肢。

這篇教程是用于Django 2.0太闺,支持Python3.4及更高的版本,如果你安裝的不是這些版本嘁圈,那么你可以在Django教程頁(yè)面的右下角選擇對(duì)應(yīng)版本的Django教程省骂,或者把Django升級(jí)到最新的版本蟀淮,不同版本可能會(huì)一些細(xì)節(jié)上的差別。如果你使用的是Python2.7钞澳,建議你調(diào)整你的代碼到文檔對(duì)應(yīng)的版本中怠惶。

創(chuàng)建一個(gè)項(xiàng)目

如果是你第一次使用Django,那么你需要做一些初始化設(shè)置轧粟,自動(dòng)生成一些必要的代碼來(lái)讓你正常使用Django策治,這些代碼包括數(shù)據(jù)庫(kù)配置,Django特定的選項(xiàng)和應(yīng)用相關(guān)的選項(xiàng)兰吟。

在命令行中览妖,cd 到你用來(lái)保存Django代碼的目錄下,運(yùn)行下面的命令:
django-admin startproject mysite
會(huì)在你的當(dāng)前目錄下創(chuàng)建一個(gè)mysite目錄揽祥。我們來(lái)看一下 startproject 命令創(chuàng)建了什么

mysite/
├── manage.py
└── mysite
    ├── __init__.py
    ├── settings.py
    ├── urls.py
    └── wsgi.py

1 directory, 5 files

上面文件的含義是:

  • 外面的 mysite/ 根目錄只是你項(xiàng)目保存的位置讽膏,和Django沒有任何關(guān)系,你也可以把這個(gè)目錄改為任何一個(gè)名稱拄丰。
  • manage.py府树,一個(gè)命令行工具,可以讓你和Django項(xiàng)目進(jìn)行交互料按。
  • 里面的 mysite/ 目錄是你的項(xiàng)目具體的代碼存放位置奄侠。它的名字是Python包名字,所以你需要用它來(lái)導(dǎo)入它內(nèi)部的模塊载矿。(例如mysite.url
  • mysite/__init__.py:一個(gè)空的文件垄潮,告訴Python解釋器,這里是一個(gè)Python包闷盔,包含了很多Python模塊弯洗。
  • mysite/settings.py:Django項(xiàng)目的配置文件。
  • mysite/urls.py:Django項(xiàng)目的URL聲明文件逢勾,Django站點(diǎn)的目錄列表牡整。
  • mysite/wsgi.py:一個(gè)兼容WSGI的web瀏覽器入口,用來(lái)調(diào)試你的項(xiàng)目溺拱。

開發(fā)服務(wù)器

上面將項(xiàng)目創(chuàng)建完成以后逃贝,我們來(lái)檢測(cè)一下項(xiàng)目是否正常工作,先進(jìn)到第一層mysite 目錄迫摔,運(yùn)行下面的命令:

$ python manage.py runserver

正常情況下會(huì)看到下面的輸出:

Performing system checks...

System check identified no issues (0 silenced).

You have 14 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.

December 11, 2017 - 12:38:34
Django version 2.0, using settings 'mysite.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

這樣就啟動(dòng)一個(gè)簡(jiǎn)單的開發(fā)服務(wù)器沐扳,這個(gè)開發(fā)服務(wù)器是一個(gè)純Python開發(fā)的輕量級(jí)服務(wù)器,已經(jīng)在Django中內(nèi)置了句占。因此在開發(fā)項(xiàng)目時(shí)可以只專注于實(shí)際的項(xiàng)目開發(fā)沪摄,而不需要去考慮配置實(shí)際的生產(chǎn)服務(wù)器,例如Apache。直到你的項(xiàng)目開發(fā)完成卓起,再考慮生產(chǎn)服務(wù)器的問題和敬。

要注意,這個(gè)服務(wù)器是不能用在生產(chǎn)服務(wù)器上的戏阅,因?yàn)榭赡軙?huì)導(dǎo)致安全風(fēng)險(xiǎn)昼弟。

開發(fā)服務(wù)器默認(rèn)監(jiān)聽地址是127.0.0.1:8000,我們?cè)趌inux服務(wù)器的圖形界面打開瀏覽器奕筐,輸入地址http://127.0.0.1:8000舱痘,如果顯示下面的界面,說(shuō)明正常工作:

image.png

如果linux服務(wù)器沒有圖形界面呢离赫,就像通常情況下芭逝,我們是在windows系統(tǒng)上安裝一個(gè)vmware軟件,然后建一個(gè)linux虛擬機(jī)渊胸,在虛擬機(jī)上進(jìn)行Django項(xiàng)目測(cè)試旬盯。此時(shí)在windows機(jī)器上打開瀏覽器查看比啟動(dòng)linux圖形界面更方便。這個(gè)時(shí)候就需要設(shè)置開發(fā)服務(wù)器監(jiān)聽的端口了翎猛,命令如下:
python manage.py runserver 0.0.0.0:8000
通過 ip:port 的格式來(lái)給出監(jiān)聽的地址和端口號(hào)胖翰,0.0.0.0表示監(jiān)聽所有地址,8000表示端口號(hào)切厘。配置完成后還需要修改mysite/settings.py的一個(gè)配置ALLOWED_HOST萨咳,將其修改為下面的格式:
vim mysite/settings.py

ALLOWED_HOSTS = [
    '192.168.1.194'
]

然后在windows系統(tǒng)上打開瀏覽器,輸入http://192.168.1.194:8000疫稿,此時(shí)出現(xiàn)下面的界面說(shuō)明你的項(xiàng)目正常工作:

image.png

192.168.1.194是你的虛擬機(jī)IP地址培他。

創(chuàng)建一個(gè)應(yīng)用(APP)

項(xiàng)目創(chuàng)建完成并正常工作以后,我們就來(lái)創(chuàng)建應(yīng)用遗座。在Django中舀凛,你創(chuàng)建的每一個(gè)應(yīng)用都會(huì)自動(dòng)包含一些特定的Python包,來(lái)用來(lái)處理一些通用問題员萍,例如常見參數(shù)配置等腾降。這樣你就不需要自己來(lái)組織創(chuàng)建一個(gè)應(yīng)用的各種目錄結(jié)構(gòu)。只需要專注于應(yīng)用的代碼開發(fā)和功能實(shí)現(xiàn)碎绎。

而一個(gè)項(xiàng)目(project)和一個(gè)應(yīng)用(APP)有什么區(qū)別呢?一個(gè)應(yīng)用通常是用來(lái)實(shí)現(xiàn)一個(gè)特定需求的抗果,例如Web博客系統(tǒng)筋帖,公共記錄數(shù)據(jù)庫(kù)或者一個(gè)簡(jiǎn)單的投票頁(yè)面。而一個(gè)項(xiàng)目則是包含配置的集合以及特定站點(diǎn)的應(yīng)用冤馏。一個(gè)項(xiàng)目可以包含多個(gè)應(yīng)用日麸,而一個(gè)應(yīng)用也可以位于多個(gè)項(xiàng)目中。

你的應(yīng)用可以位于任何一個(gè)python路徑中。如果你不了解什么是Python路徑代箭,可以先查看一下相關(guān)資料墩划。這個(gè)教程里,我們?cè)?manage.py 同級(jí)目錄創(chuàng)建我們的應(yīng)用嗡综。這樣的話乙帮,這個(gè)應(yīng)用就可以作為 mysite 同級(jí)的模塊來(lái)導(dǎo)入,而不是作為 mysite 的子模塊來(lái)處理极景。(因?yàn)榇藭r(shí)應(yīng)用目錄和 mysite 目錄在同一個(gè)目錄底下)運(yùn)行下面的命令來(lái)創(chuàng)建一個(gè)應(yīng)用:
$ python manage.py startapp polls
下面是這個(gè)命令創(chuàng)建好的目錄結(jié)構(gòu):

polls/
├── admin.py
├── apps.py
├── __init__.py
├── migrations
│   └── __init__.py
├── models.py
├── tests.py
└── views.py

1 directory, 7 files

這個(gè)目錄結(jié)構(gòu)組織了投票應(yīng)用的結(jié)構(gòu)察净。

寫你的第一個(gè)視圖(view)

我們來(lái)嘗試寫第一個(gè)視圖,打開文件polls/views.py盼樟,把下面的代碼放進(jìn)去:

from django.http import HttpResponse


def index(request):
    return HttpResponse("Hello, world. You're at the polls index.")

上面是一個(gè)最簡(jiǎn)單的Django視圖示例氢卡,要調(diào)用這個(gè)視圖,我們需要將這個(gè)視圖映射到一個(gè)URL上面晨缴,所以我們需要一個(gè)URL配置译秦。
在polls目錄下創(chuàng)建一個(gè)URL陪指紋機(jī),叫做urls.py击碗,你的應(yīng)用目錄結(jié)構(gòu)會(huì)如下所示:

polls/
    __init__.py
    admin.py
    apps.py
    migrations/
        __init__.py
    models.py
    tests.py
    urls.py
    views.py

在urls.py文件中寫入下面的代碼:

from django.urls import path

from . import views

urlpatterns = [
    path('', views.index, name='index'),
]

下一步是將polls.urls模塊里指定URL根配置筑悴。在mysite/urls.py文件里,添加一個(gè)django.urls.include導(dǎo)入,并插入一個(gè)include()urlpatterns列表里延都,如下所示:

from django.urls import include, path
from django.contrib import admin

urlpatterns = [
    path('polls/', include('polls.urls')),
    path('admin/', admin.site.urls),
]

include()函數(shù)可以引用其他的URL配置雷猪,每當(dāng)Django遇到include()時(shí),它將切斷URL中與第一個(gè)參數(shù)里匹配的部分(如這里匹配polls/)晰房,并將剩余的字符串發(fā)送到后面包含的URL配置中以供進(jìn)一步處理求摇。
include()函數(shù)背后的思想是,讓插入和顯示URL更簡(jiǎn)單殊者。因?yàn)橥镀睉?yīng)用有自己的URL配置(polls/urls.py)与境,因此投票應(yīng)用的目錄可以位于"/polls/","/fun_polls/"猖吴,或者"/content/polls/"摔刁,或任何其他根路徑下,app都可以正常工作(這里的路徑應(yīng)該指的是web瀏覽器里的URL路徑)海蔽。

現(xiàn)在你已經(jīng)將一個(gè)主頁(yè)視圖連接到一個(gè)URL配置上共屈,我們來(lái)檢查一下是不是正常工作。運(yùn)行下面的命令
$python manage.py runserver
打開瀏覽器党窜,輸入http://localhost:8000/polls/拗引,如果看到下面的內(nèi)容,說(shuō)明正常工作幌衣。這些內(nèi)容就是在index視圖里定義的內(nèi)容矾削。

image.png

path()函數(shù)傳遞4個(gè)參數(shù),2個(gè)是必須參數(shù):route和view,另外兩個(gè)是可選參數(shù):kwargs和name哼凯。這一點(diǎn)上欲间,非常值得回顧一下這些參數(shù)的作用:

path()參數(shù):route

route是一個(gè)包含URL表達(dá)式的字符串,處理一個(gè)請(qǐng)求的時(shí)候断部,Django從urlpatterns的第一個(gè)表達(dá)式開始猎贴,在列表中依次向下。比較請(qǐng)求的URL和列表中的URL表達(dá)式是否匹配家坎,直到找到一個(gè)匹配的為止嘱能。
表達(dá)式不搜索GET和POST參數(shù),或者域名虱疏。例如惹骂,請(qǐng)求https://www.example.com/myapp/地址,URL配置只會(huì)對(duì)比myapp/做瞪,請(qǐng)求https://www.example.com/myapp/?page=3也只會(huì)對(duì)比myapp/.

path()參數(shù):view

當(dāng)Django找到一個(gè)匹配的表達(dá)式時(shí)对粪,會(huì)調(diào)用指定的視圖函數(shù),將一個(gè)HttpRequest對(duì)象作為第一個(gè)參數(shù)装蓬,并將路由中捕獲的任何值作為關(guān)鍵字參數(shù)著拭。后面我們會(huì)舉個(gè)例子說(shuō)明。

path()參數(shù):kwargs

關(guān)鍵字參數(shù)可以通過一個(gè)字典傳遞給目標(biāo)視圖牍帚。我們會(huì)在后面的教程內(nèi)容里使用這個(gè)特性儡遮。

path()參數(shù):name

給你的URL取一個(gè)名字,可以讓你在Django的其他地方明確引用這個(gè)URL暗赶,特別是在模板中鄙币。可以讓你只修改一個(gè)文件來(lái)完成項(xiàng)目里URL表達(dá)式的全局修改蹂随。

上面就是基本請(qǐng)求和相應(yīng)的流程十嘿,后面開始第二部分,開始使用數(shù)據(jù)庫(kù)岳锁。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末绩衷,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子激率,更是在濱河造成了極大的恐慌咳燕,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,290評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件乒躺,死亡現(xiàn)場(chǎng)離奇詭異迟郎,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)聪蘸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人健爬,你說(shuō)我怎么就攤上這事控乾。” “怎么了娜遵?”我有些...
    開封第一講書人閱讀 156,872評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵蜕衡,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我设拟,道長(zhǎng)慨仿,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,415評(píng)論 1 283
  • 正文 為了忘掉前任纳胧,我火速辦了婚禮镰吆,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘跑慕。我一直安慰自己万皿,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評(píng)論 6 385
  • 文/花漫 我一把揭開白布核行。 她就那樣靜靜地躺著牢硅,像睡著了一般。 火紅的嫁衣襯著肌膚如雪芝雪。 梳的紋絲不亂的頭發(fā)上减余,一...
    開封第一講書人閱讀 49,784評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音惩系,去河邊找鬼位岔。 笑死,一個(gè)胖子當(dāng)著我的面吹牛蛆挫,可吹牛的內(nèi)容都是我干的赃承。 我是一名探鬼主播,決...
    沈念sama閱讀 38,927評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼悴侵,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼瞧剖!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起可免,我...
    開封第一講書人閱讀 37,691評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤抓于,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后浇借,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體捉撮,經(jīng)...
    沈念sama閱讀 44,137評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評(píng)論 2 326
  • 正文 我和宋清朗相戀三年妇垢,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了巾遭。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肉康。...
    茶點(diǎn)故事閱讀 38,622評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖灼舍,靈堂內(nèi)的尸體忽然破棺而出吼和,到底是詐尸還是另有隱情,我是刑警寧澤骑素,帶...
    沈念sama閱讀 34,289評(píng)論 4 329
  • 正文 年R本政府宣布炫乓,位于F島的核電站,受9級(jí)特大地震影響献丑,放射性物質(zhì)發(fā)生泄漏末捣。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評(píng)論 3 312
  • 文/蒙蒙 一创橄、第九天 我趴在偏房一處隱蔽的房頂上張望箩做。 院中可真熱鬧,春花似錦筐摘、人聲如沸卒茬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)圃酵。三九已至,卻和暖如春馍管,著一層夾襖步出監(jiān)牢的瞬間郭赐,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工确沸, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留捌锭,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,316評(píng)論 2 360
  • 正文 我出身青樓罗捎,卻偏偏與公主長(zhǎng)得像观谦,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子桨菜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評(píng)論 2 348

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