Django做一個投票應(yīng)用

第一章

讓我們通過示例來學(xué)習(xí)。

通過這個教程,我們將帶著你創(chuàng)建一個基本的投票應(yīng)用程序。

它將由兩部分組成:

一個讓人們查看和投票的公共站點。

一個讓你能添加、修改和刪除投票的管理站點。

我們假定你已經(jīng)閱讀了?安裝 Django。你能知道 Django 已被安裝,且安裝的是哪個版本,通過在命令提示行輸入命令(由 $ 前綴)。

$python -m django --version

如果這行命令輸出了一個版本號,證明你已經(jīng)安裝了此版本的 Django;如果你得到的是一個“No module named django”的錯誤提示,則表明你還未安裝。

這個教程是為了 Django 2.0 寫的,它支持 Python 3.4 和后續(xù)版本。如果 Django 的版本不匹配,你可以通過頁面右下角的版本切換器切換到對應(yīng)你版本的教程,或更新至最新版本。如果你正在使用一個較老版本的 Python,在?我應(yīng)該使用哪個版本的Python來配合Django??查找一個合適的 Django 版本。

你可以查看文檔?如何安裝 Django?來獲得關(guān)于移除舊版本,安裝新版本的流程和建議。

從哪里獲得幫助:

如果你在閱讀或?qū)嵺`本教程中遇到困難, 請發(fā)消息給?django-users?或加入?#django on irc.freenode.net?來和其他的 Django 用戶交流,他們也許能幫到你。

創(chuàng)建項目?

如果這是你第一次使用 Django 的話,你需要一些初始化設(shè)置。也就是說,你需要用一些自動生成的代碼配置一個 Django?project?—— 即一個 Django 項目實例需要的設(shè)置項集合,包括數(shù)據(jù)庫配置、Django 配置和應(yīng)用程序配置。

打開命令行,cd?到一個你想放置你代碼的目錄,然后運行以下命令:

$django-admin startproject mysite

這行代碼將會在當(dāng)前目錄下創(chuàng)建一個?mysite?目錄。如果命令失敗了,查看?運行``django-admin``時遇到的問題,可能能給你提供幫助。

Note

你得避免使用 Python 或 Django 的內(nèi)部保留字來命名你的項目。具體地說,你得避免使用像?django?(會和 Django 自己產(chǎn)生沖突)或?test?(會和 Python 的內(nèi)置組件產(chǎn)生沖突)這樣的名字。

我的代碼該放在哪?

如果你曾經(jīng)是原生 PHP 程序員(沒有使用過現(xiàn)代框架),你可能會習(xí)慣于把代碼放在 Web 服務(wù)器的文檔根目錄(諸如?/var/www)。當(dāng)使用 Django 時不需要這樣做。把所有 Python 代碼放在 Web 服務(wù)器的根目錄不是個好主意,因為這樣會有風(fēng)險。比如會提高人們在網(wǎng)站上看到你的代碼的可能性。這不利于網(wǎng)站的安全。

把你的代碼放在文檔根目錄?以外?的某些地方吧,比如?/home/mycode。

讓我們看看?startproject?創(chuàng)建了些什么:

mysite/manage.pymysite/__init__.pysettings.pyurls.pywsgi.py

這些目錄和文件的用處是:

最外層的:file:?mysite/?根目錄只是你項目的容器, Django 不關(guān)心它的名字,你可以將它重命名為任何你喜歡的名字。

manage.py: 一個讓你用各種方式管理 Django 項目的命令行工具。你可以閱讀?django-admin and manage.py?獲取所有?manage.py的細(xì)節(jié)。

里面一層的?mysite/?目錄包含你的項目,它是一個純 Python 包。它的名字就是當(dāng)你引用它內(nèi)部任何東西時需要用到的 Python 包名。 (比如?mysite.urls).

mysite/__init__.py:一個空文件,告訴 Python 這個目錄應(yīng)該被認(rèn)為是一個 Python 包。如果你是 Python 初學(xué)者,閱讀官方文檔中的?更多關(guān)于包的知識。

mysite/settings.py:Django 項目的配置文件。如果你想知道這個文件是如何工作的,請查看?Django settings?了解細(xì)節(jié)。

mysite/urls.py:Django 項目的 URL 聲明,就像你網(wǎng)站的“目錄”。閱讀?URL調(diào)度器?文檔來獲取更多關(guān)于 URL 的內(nèi)容。

mysite/wsgi.py:作為你的項目的運行在 WSGI 兼容的Web服務(wù)器上的入口。閱讀?如何使用 WSGI 進(jìn)行部署?了解更多細(xì)節(jié)。

用于開發(fā)的簡易服務(wù)器?

讓我們來確認(rèn)一下你的 Django 項目是否真的創(chuàng)建成功了。如果你的當(dāng)前目錄不是外層的?mysite?目錄的話,請切換到此目錄,然后運行下面的命令:

$python manage.py runserver

你應(yīng)該會看到如下輸出:

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.八月 01, 2018 - 15:50:53Django version 2.0, using settings 'mysite.settings'Starting development server athttp://127.0.0.1:8000/Quit the server with CONTROL-C.

Note

忽略有關(guān)未應(yīng)用最新數(shù)據(jù)庫遷移的警告,稍后我們處理數(shù)據(jù)庫。

你剛剛啟動的是 Django 自帶的用于開發(fā)的簡易服務(wù)器,它是一個用純 Python 寫的輕量級的 Web 服務(wù)器。我們將這個服務(wù)器內(nèi)置在 Django 中是為了讓你能快速的開發(fā)出想要的東西,因為你不需要進(jìn)行配置生產(chǎn)級別的服務(wù)器(比如 Apache)方面的工作,除非你已經(jīng)準(zhǔn)備好投入生產(chǎn)環(huán)境了。

現(xiàn)在是個提醒你的好時機:千萬不要?將這個服務(wù)器用于和生產(chǎn)環(huán)境相關(guān)的任何地方。這個服務(wù)器只是為了開發(fā)而設(shè)計的。(我們在 Web 框架方面是專家,在 Web 服務(wù)器方面并不是。)

現(xiàn)在,服務(wù)器正在運行,瀏覽器訪問?https://127.0.0.1:8000/。你將會看到一個“祝賀”頁面,隨著一只火箭發(fā)射,服務(wù)器已經(jīng)運行了。

更換端口

默認(rèn)情況下,runserver?命令會將服務(wù)器設(shè)置為監(jiān)聽本機內(nèi)部 IP 的 8000 端口。

如果你想更換服務(wù)器的監(jiān)聽端口,請使用命令行參數(shù)。舉個例子,下面的命令會使服務(wù)器監(jiān)聽 8080 端口:

$python manage.py runserver8080

如果你想要修改服務(wù)器監(jiān)聽的IP,在端口之前輸入新的。比如,為了監(jiān)聽所有服務(wù)器的公開IP(這你運行 Vagrant 或想要向網(wǎng)絡(luò)上的其它電腦展示你的成果時很有用),使用:

$python manage.py runserver0:8000

0?是?0.0.0.0?的簡寫。完整的關(guān)于開發(fā)服務(wù)器的文檔可以在?:djamdin:`runserver`?參考文檔中找到。

會自動重新加載的服務(wù)器?runserver

用于開發(fā)的服務(wù)器在需要的情況下會對每一次的訪問請求重新載入一遍 Python 代碼。所以你不需要為了讓修改的代碼生效而頻繁的重新啟動服務(wù)器。然而,一些動作,比如添加新文件,將不會觸發(fā)自動重新加載,這時你得自己手動重啟服務(wù)器。

創(chuàng)建投票應(yīng)用?

現(xiàn)在你的開發(fā)環(huán)境——這個“項目” ——已經(jīng)配置好了,你可以開始干活了。

在 Django 中,每一個應(yīng)用都是一個 Python 包,并且遵循著相同的約定。Django 自帶一個工具,可以幫你生成應(yīng)用的基礎(chǔ)目錄結(jié)構(gòu),這樣你就能專心寫代碼,而不是創(chuàng)建目錄了。

項目 VS 應(yīng)用

項目和應(yīng)用有啥區(qū)別?應(yīng)用是一個專門做某件事的網(wǎng)絡(luò)應(yīng)用程序——比如博客系統(tǒng),或者公共記錄的數(shù)據(jù)庫,或者簡單的投票程序。項目則是一個網(wǎng)站使用的配置和應(yīng)用的集合。項目可以包含很多個應(yīng)用。應(yīng)用可以被很多個項目使用。

你的應(yīng)用可以存放在任何?Python path?中定義的路徑。在這個教程中,我們將在你的?manage.py?同級目錄下創(chuàng)建投票應(yīng)用。這樣它就可以作為頂級模塊導(dǎo)入,而不是?mysite?的子模塊。

請確定你現(xiàn)在處于?manage.py?所在的目錄下,然后運行這行命令來創(chuàng)建一個應(yīng)用:

$python manage.py startapp polls

這將會創(chuàng)建一個?polls?目錄,它的目錄結(jié)構(gòu)大致如下:

polls/__init__.pyadmin.pyapps.pymigrations/__init__.pymodels.pytests.pyviews.py

這個目錄結(jié)構(gòu)包括了投票應(yīng)用的全部內(nèi)容。

編寫第一個視圖?

讓我們開始編寫第一個視圖吧。打開?polls/views.py,把下面這些 Python 代碼輸入進(jìn)去:

polls/views.py

fromdjango.httpimportHttpResponsedefindex(request):returnHttpResponse("Hello, world. You're at the polls index.")

這是 Django 中最簡單的視圖。如果想看見效果,我們需要將一個 URL 映射到它——這就是我們需要 URLconf 的原因了。

為了創(chuàng)建 URLconf,請在 polls 目錄里新建一個?urls.py?文件。你的應(yīng)用目錄現(xiàn)在看起來應(yīng)該是這樣:

polls/__init__.pyadmin.pyapps.pymigrations/__init__.pymodels.pytests.pyurls.pyviews.py

在?polls/urls.py?中,輸入如下代碼:

polls/urls.py

fromdjango.urlsimportpathfrom.importviewsurlpatterns=[path('',views.index,name='index'),]

下一步是要在根 URLconf 文件中指定我們創(chuàng)建的?polls.urls?模塊。在?mysite/urls.py?文件的?urlpatterns?列表里插入一個?include(), 如下:

mysite/urls.py

fromdjango.contribimportadminfromdjango.urlsimportinclude,pathurlpatterns=[path('polls/',include('polls.urls')),path('admin/',admin.site.urls),]

函數(shù)?include()?允許引用其它 URLconfs。每當(dāng) Django 遇到 :func:~django.urls.include?時,它會截斷與此項匹配的 URL 的部分,并將剩余的字符串發(fā)送到 URLconf 以供進(jìn)一步處理。

我們設(shè)計?include()?的理念是使其可以即插即用。因為投票應(yīng)用有它自己的 URLconf(?polls/urls.py?),他們能夠被放在 "/polls/" , "/fun_polls/" ,"/content/polls/",或者其他任何路徑下,這個應(yīng)用都能夠正常工作。

何時使用?include()

當(dāng)包括其它 URL 模式時你應(yīng)該總是使用?include()?,?admin.site.urls?是唯一例外。

你現(xiàn)在把?index?視圖添加進(jìn)了 URLconf。可以驗證是否正常工作,運行下面的命令:

$python manage.py runserver

用你的瀏覽器訪問?http://localhost:8000/polls/,你應(yīng)該能夠看見 "Hello, world. You're at the polls index." ,這是你在?index?視圖中定義的。

函數(shù)?path()?具有四個參數(shù),兩個必須參數(shù):route?和?view,兩個可選參數(shù):kwargs?和?name?,F(xiàn)在,是時候來研究這些參數(shù)的含義了。

path()?參數(shù):?route?

route?是一個匹配 URL 的準(zhǔn)則(類似正則表達(dá)式)。當(dāng) Django 響應(yīng)一個請求時,它會從?urlpatterns?的第一項開始,按順序依次匹配列表中的項,直到找到匹配的項。

這些準(zhǔn)則不會匹配 GET 和 POST 參數(shù)或域名。例如,URLconf 在處理請求?https://www.example.com/myapp/?時,它會嘗試匹配?myapp/?。處理請求?https://www.example.com/myapp/?page=3?時,也只會嘗試匹配?myapp/。

path()?參數(shù):?view?

當(dāng) Django 找到了一個匹配的準(zhǔn)則,就會調(diào)用這個特定的視圖函數(shù),并傳入一個?HttpRequest?對象作為第一個參數(shù),被“捕獲”的參數(shù)以關(guān)鍵字參數(shù)的形式傳入。稍后,我們會給出一個例子。

path()?參數(shù):?kwargs?

任意個關(guān)鍵字參數(shù)可以作為一個字典傳遞給目標(biāo)視圖函數(shù)。本教程中不會使用這一特性。

第二章鏈接

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容