本文是Django系列文章渤刃,請(qǐng)到無(wú)聊才讀書(shū)的博客了解更多詳細(xì)信息。
編寫(xiě)第一個(gè)Django應(yīng)用黔寇,第1部分
在本教程中滤钱,我們將引導(dǎo)您完成基本民意調(diào)查應(yīng)用程序的創(chuàng)建觉壶。
它由兩部分組成:
- 一個(gè)允許人們查看民意測(cè)驗(yàn)并對(duì)其進(jìn)行投票的公共站點(diǎn)。
- 一個(gè)允許您添加件缸,更改和刪除民意調(diào)查的管理站點(diǎn)铜靶。
我們假設(shè)您已經(jīng)安裝了Django。您可以通過(guò)在shell提示符(以$前綴表示)中運(yùn)行以下命令來(lái)告訴Django已安裝以及安裝了哪個(gè)版本:
$ python -m django --version
如果安裝了Django他炊,則應(yīng)該看到安裝的版本争剿。如果不是,您將得到一個(gè)錯(cuò)誤消息痊末,提示“沒(méi)有名為django的模塊”蚕苇。
本教程是為Django 2.2編寫(xiě)的,它支持Python 3.5及更高版本凿叠。如果Django版本不匹配涩笤,則可以使用此頁(yè)面右下角的版本切換器來(lái)參考您的Django版本的教程,或?qū)jango更新為最新版本盒件。如果您使用的是Python的舊版本蹬碧,請(qǐng)檢查我可以在Django中使用哪個(gè)Python版本?找到兼容版本的Django炒刁。
請(qǐng)參閱如何安裝Django恩沽,以獲取有關(guān)如何刪除Django的較早版本并安裝較新版本的建議。
在哪里獲得幫助:
如果您在閱讀本教程時(shí)遇到麻煩切心,請(qǐng)向django用戶(hù)發(fā)布消息飒筑,或在irc.freenode.net上通過(guò)#django來(lái)與其他可能會(huì)提供幫助的Django用戶(hù)聊天。
創(chuàng)建項(xiàng)目?
如果這是您第一次使用Django绽昏,則必須進(jìn)行一些初始設(shè)置协屡。即,您將需要自動(dòng)生成一些代碼來(lái)建立Django 項(xiàng)目 -Django實(shí)例的一組設(shè)置全谤,包括數(shù)據(jù)庫(kù)配置肤晓,特定于Django的選項(xiàng)和特定于應(yīng)用程序的設(shè)置。
從命令行cd
進(jìn)入要存儲(chǔ)代碼的目錄认然,然后運(yùn)行以下命令:
$ django-admin startproject mysite
這將mysite
在當(dāng)前目錄中創(chuàng)建一個(gè)目錄补憾。如果它不起作用,請(qǐng)參閱運(yùn)行django-admin時(shí)遇到的問(wèn)題卷员。
注意
您需要避免使用內(nèi)置的Python或Django組件來(lái)命名項(xiàng)目盈匾。特別是,這意味著您應(yīng)該避免使用類(lèi)似django
(與Django本身沖突)或test
(與內(nèi)置Python包沖突)之類(lèi)的名稱(chēng)毕骡。
該代碼應(yīng)該放在哪里削饵?
如果您的背景是純樸的舊PHP(不使用現(xiàn)代框架)岩瘦,則可能習(xí)慣于將代碼放在Web服務(wù)器的文檔根目錄下(例如/var/www
)。使用Django窿撬,您無(wú)需這么做启昧。將任何這些Python代碼放在??Web服務(wù)器的文檔根目錄中不是一個(gè)好主意,因?yàn)檫@冒著人們可能能夠通過(guò)Web查看您的代碼的風(fēng)險(xiǎn)劈伴。這對(duì)安全性不利密末。
將代碼放在文檔根目錄之外的某個(gè)目錄中,例如 /home/mycode
跛璧。
讓我們看看startproject
創(chuàng)建了什么:
mysite/
manage.py
mysite/
__init__.py
settings.py
urls.py
wsgi.py
這些文件是:
- 外部
mysite/
根目錄只是您的項(xiàng)目的容器严里。它的名稱(chēng)與Django無(wú)關(guān);您可以將其重命名為任何喜歡的名稱(chēng)赡模。 -
manage.py
:一個(gè)命令行實(shí)用程序田炭,可讓您以各種方式與該Django項(xiàng)目進(jìn)行交互师抄。您可以manage.py
在django-admin和manage.py中閱讀有關(guān)的所有詳細(xì)信息 漓柑。 - 內(nèi)部
mysite/
目錄是項(xiàng)目的實(shí)際Python包。它的名稱(chēng)是Python包名稱(chēng)叨吮,您需要使用它來(lái)導(dǎo)入其中的任何內(nèi)容(例如mysite.urls
)辆布。 -
mysite/__init__.py
:一個(gè)空文件,告訴Python該目錄應(yīng)視為Python軟件包茶鉴。如果您是Python初學(xué)者锋玲,請(qǐng)?jiān)赑ython官方文檔中閱讀有關(guān)包的更多信息。 -
mysite/settings.py
:此Django項(xiàng)目的設(shè)置/配置涵叮。 Django設(shè)置將告訴您所有設(shè)置的工作方式惭蹂。 -
mysite/urls.py
:此Django項(xiàng)目的URL聲明;Django支持的網(wǎng)站的“目錄”割粮。您可以在URL調(diào)度程序中閱讀有關(guān)URL的更多信息盾碗。 -
mysite/wsgi.py
:兼容WSGI的Web服務(wù)器為您的項(xiàng)目提供服務(wù)的入口點(diǎn)。有關(guān)更多詳細(xì)信息舀瓢,請(qǐng)參見(jiàn)如何使用WSGI進(jìn)行部署廷雅。
開(kāi)發(fā)服務(wù)器
讓我們驗(yàn)證您的Django項(xiàng)目是否有效。mysite
如果尚未進(jìn)入外部目錄京髓,請(qǐng)運(yùn)行以下命令:
$ 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.
October 16, 2019 - 15:50:53
Django version 2.2, 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.
注意
暫時(shí)忽略有關(guān)未應(yīng)用數(shù)據(jù)庫(kù)遷移的警告航缀;我們將盡快處理數(shù)據(jù)庫(kù)。
您已經(jīng)啟動(dòng)了Django開(kāi)發(fā)服務(wù)器堰怨,這是一個(gè)純Python編寫(xiě)的輕量級(jí)Web服務(wù)器芥玉。我們已經(jīng)將它包含在Django中,因此您可以快速進(jìn)行開(kāi)發(fā)备图,而無(wú)需準(zhǔn)備配置生產(chǎn)服務(wù)器(例如Apache)灿巧,直到準(zhǔn)備好進(jìn)行生產(chǎn)為止皇型。
現(xiàn)在是要注意的好時(shí)機(jī):請(qǐng)勿在類(lèi)似于生產(chǎn)環(huán)境的任何環(huán)境中使用此服務(wù)器。僅在開(kāi)發(fā)時(shí)使用砸烦。(我們的業(yè)務(wù)是制作Web框架弃鸦,而不是Web服務(wù)器。)
現(xiàn)在服務(wù)器已在運(yùn)行幢痘,請(qǐng)使用Web瀏覽器訪問(wèn)http://127.0.0.1:8000/唬格。您會(huì)看到“恭喜!”頁(yè)面颜说,其中一枚火箭正在起飛购岗。有效!
更改端口
默認(rèn)情況下门粪,該runserver
命令在內(nèi)部IP的端口8000上啟動(dòng)開(kāi)發(fā)服務(wù)器喊积。
如果要更改服務(wù)器的端口,請(qǐng)將其作為命令行參數(shù)傳遞玄妈。例如乾吻,此命令在端口8080上啟動(dòng)服務(wù)器:
$ python manage.py runserver 8080
如果要更改服務(wù)器的IP,請(qǐng)將其與端口一起傳遞拟蜻。例如绎签,要偵聽(tīng)所有可用的公共IP(如果您正在運(yùn)行Vagrant或想在網(wǎng)絡(luò)上的其他計(jì)算機(jī)上炫耀您的工作,這很有用)酝锅,請(qǐng)使用:
$ python manage.py runserver 0:8000
0是0.0.0.0的快捷方式诡必。有關(guān)開(kāi)發(fā)服務(wù)器的完整文檔,請(qǐng)參見(jiàn)runserver
參考資料搔扁。
自動(dòng)重新加載
runserver
開(kāi)發(fā)服務(wù)器會(huì)根據(jù)需要自動(dòng)為每個(gè)請(qǐng)求重新加載Python代碼爸舒。您無(wú)需重新啟動(dòng)服務(wù)器即可使代碼更改生效。但是稿蹲,某些操作(例如添加文件)不會(huì)觸發(fā)重新啟動(dòng)扭勉,因此在這種情況下,您必須重新啟動(dòng)服務(wù)器场绿。
創(chuàng)建民意調(diào)查應(yīng)用程序
現(xiàn)在剖效,您的環(huán)境(一個(gè)“項(xiàng)目”)已設(shè)置好,您就可以開(kāi)始工作了焰盗。
您在Django中編寫(xiě)的每個(gè)應(yīng)用程序都包含一個(gè)遵循特定約定的Python包璧尸。Django附帶了一個(gè)實(shí)用程序,該實(shí)用程序會(huì)自動(dòng)生成應(yīng)用程序的基本目錄結(jié)構(gòu)熬拒,因此您可以專(zhuān)注于編寫(xiě)代碼爷光,而不是創(chuàng)建目錄。
項(xiàng)目與應(yīng)用
項(xiàng)目和應(yīng)用之間有什么區(qū)別澎粟?應(yīng)用程序是執(zhí)行某項(xiàng)操作的Web應(yīng)用程序蛀序,例如Weblog系統(tǒng)欢瞪,公共記錄數(shù)據(jù)庫(kù)或簡(jiǎn)單的民意調(diào)查應(yīng)用程序。項(xiàng)目是特定網(wǎng)站的配置和應(yīng)用程序的集合徐裸。一個(gè)項(xiàng)目可以包含多個(gè)應(yīng)用程序遣鼓。一個(gè)應(yīng)用程序可以在多個(gè)項(xiàng)目中。
您的應(yīng)用程序可以放在Python路徑上的任何位置重贺。在本教程中骑祟,我們將在manage.py
文件旁邊創(chuàng)建輪詢(xún)應(yīng)用程序,以便可以將其作為自己的頂級(jí)模塊(而不是的子模塊)導(dǎo)入mysite
气笙。
要?jiǎng)?chuàng)建您的應(yīng)用次企,請(qǐng)確保與您位于同一目錄,manage.py
然后鍵入以下命令:
$ python manage.py startapp polls
這將創(chuàng)建一個(gè)目錄polls
潜圃,其布局如下所示:
polls/
__init__.py
admin.py
apps.py
migrations/
__init__.py
models.py
tests.py
views.py
此目錄結(jié)構(gòu)將容納輪詢(xún)應(yīng)用程序缸棵。
寫(xiě)下您的第一個(gè)視圖
讓我們來(lái)寫(xiě)第一個(gè)視圖。打開(kāi)文件polls/views.py
谭期,并將以下Python代碼放入其中:
polls/views.py
from django.http import HttpResponse
def index(request):
return HttpResponse("Hello, world. You're at the polls index.")</font>
這是Django中最簡(jiǎn)單的視圖堵第。要調(diào)用該視圖,我們需要將其映射到URL-為此崇堵,我們需要一個(gè)URLconf型诚。
要在民意調(diào)查目錄中創(chuàng)建URLconf,請(qǐng)創(chuàng)建一個(gè)名為urls.py
的文件鸳劳。您的應(yīng)用目錄現(xiàn)在應(yīng)如下所示:
polls/
__init__.py
admin.py
apps.py
migrations/
__init__.py
models.py
tests.py
urls.py
views.py
在polls/urls.py
文件中包含以下代碼:
polls/urls.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.index, name='index'),
]
下一步是將根URLconf指向該polls.urls
模塊。在中 mysite/urls.py
也搓,添加的導(dǎo)入django.urls.include
并將插入 include()
到urlpatterns
列表中赏廓,因此您具有:
mysite/urls.py
from django.contrib import admin
from django.urls import include, path
urlpatterns = [
path('polls/', include('polls.urls')),
path('admin/', admin.site.urls),
]
該include()
功能允許引用其他URLconf。每當(dāng)Django遇到時(shí)include()
傍妒,它都會(huì)截?cái)嘀钡皆摃r(shí)間點(diǎn)匹配的URL的任何部分幔摸,并將剩余的字符串發(fā)送到包含的URLconf中以進(jìn)行進(jìn)一步處理。
背后的想法include()
是簡(jiǎn)化URL的即插即用颤练。由于民意調(diào)查位于其自己的URLconf(polls/urls.py
)中既忆,因此可以將其放在“ / polls /”下,或者“ / fun_polls /”下嗦玖,或者“ / content / polls /”下或任何其他路徑根下患雇,并且該應(yīng)用仍會(huì)工作。
何時(shí)使用
include()
include()
包括其他URL模式時(shí)宇挫,應(yīng)始終使用苛吱。admin.site.urls
是唯一的例外。
現(xiàn)在器瘪,您已將index
視圖連接到URLconf翠储。驗(yàn)證它是否與以下命令一起使用:
$ python manage.py runserver
在瀏覽器中轉(zhuǎn)到http:// localhost:8000 / polls /绘雁,您應(yīng)該看到文本“ Hello,world援所。您正在民意調(diào)查索引中庐舟。”(您在index
視圖中定義的) 。
網(wǎng)頁(yè)未找到住拭?
如果您在這里看到錯(cuò)誤頁(yè)面继阻,請(qǐng)檢查您是否要訪問(wèn) http:// localhost:8000 / polls /而不是http:// localhost:8000 /。
該path()
函數(shù)傳遞了四個(gè)參數(shù)废酷,兩個(gè)是必需的 route
和view
瘟檩,以及兩個(gè)可選的kwargs
和name
。在這一點(diǎn)上澈蟆,有必要回顧一下這些論點(diǎn)的含義墨辛。
path()
參數(shù):route
?
route
是包含URL模式的字符串。在處理請(qǐng)求時(shí)趴俘,Django從第一個(gè)模式開(kāi)始睹簇,urlpatterns
然后沿列表向下移動(dòng),將請(qǐng)求的URL與每個(gè)模式進(jìn)行比較寥闪,直到找到匹配的URL太惠。
模式不搜索GET和POST參數(shù)或域名。例如疲憋,在對(duì)的請(qǐng)求中https://www.example.com/myapp/
凿渊,URLconf將尋找 myapp/
。在請(qǐng)求中https://www.example.com/myapp/?page=3
缚柳,URLconf也將尋找myapp/
埃脏。
path()
參數(shù):view
?
當(dāng)Django找到匹配的模式時(shí),它將使用HttpRequest
對(duì)象作為第一個(gè)參數(shù)秋忙,并將路線中所有“捕獲的”值作為關(guān)鍵字參數(shù)彩掐,調(diào)用指定的view函數(shù)。我們將舉一個(gè)例子灰追。
path()
參數(shù):kwargs
?
可以在字典中將任意關(guān)鍵字參數(shù)傳遞給目標(biāo)視圖堵幽。在本教程中,我們將不使用Django的此功能弹澎。
path()
參數(shù):name
?
命名URL可以使您在Django中的其他地方(尤其是在模板內(nèi)部)明確地引用它朴下。這項(xiàng)強(qiáng)大的功能可讓您僅觸摸單個(gè)文件即可對(duì)項(xiàng)目的URL模式進(jìn)行全局更改。
如果您對(duì)基本的請(qǐng)求和響應(yīng)流程感到滿(mǎn)意裁奇,請(qǐng)閱讀 本教程的第2部分桐猬,開(kāi)始使用數(shù)據(jù)庫(kù)。