開始寫第一個(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ō)明正常工作:
如果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)目正常工作:
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)容矾削。
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ù)岳锁。