編寫(xiě)第一個(gè)Django應(yīng)用 (一)

本文是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.pydjango-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
00.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è)是必需的 routeview瘟檩,以及兩個(gè)可選的kwargsname。在這一點(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ù)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末刽肠,一起剝皮案震驚了整個(gè)濱河市溃肪,隨后出現(xiàn)的幾起案子免胃,更是在濱河造成了極大的恐慌,老刑警劉巖惫撰,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件羔沙,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡厨钻,警方通過(guò)查閱死者的電腦和手機(jī)扼雏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)夯膀,“玉大人诗充,你說(shuō)我怎么就攤上這事∮战ǎ” “怎么了蝴蜓?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)俺猿。 經(jīng)常有香客問(wèn)我茎匠,道長(zhǎng),這世上最難降的妖魔是什么押袍? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任诵冒,我火速辦了婚禮,結(jié)果婚禮上谊惭,老公的妹妹穿的比我還像新娘汽馋。我一直安慰自己,他們只是感情好午笛,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布惭蟋。 她就那樣靜靜地躺著,像睡著了一般药磺。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上煤伟,一...
    開(kāi)封第一講書(shū)人閱讀 51,370評(píng)論 1 302
  • 那天癌佩,我揣著相機(jī)與錄音,去河邊找鬼便锨。 笑死围辙,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的放案。 我是一名探鬼主播姚建,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼吱殉!你這毒婦竟也來(lái)了掸冤?” 一聲冷哼從身側(cè)響起厘托,我...
    開(kāi)封第一講書(shū)人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎稿湿,沒(méi)想到半個(gè)月后铅匹,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡饺藤,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年包斑,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片涕俗。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡罗丰,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出再姑,到底是詐尸還是另有隱情萌抵,我是刑警寧澤,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布询刹,位于F島的核電站谜嫉,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏凹联。R本人自食惡果不足惜沐兰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蔽挠。 院中可真熱鬧住闯,春花似錦、人聲如沸澳淑。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)杠巡。三九已至量窘,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間氢拥,已是汗流浹背蚌铜。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留嫩海,地道東北人冬殃。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像叁怪,于是被迫代替她去往敵國(guó)和親审葬。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

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