Django官方手冊--1

編寫你的第一個Django App,第一章

讓我們用一個示例來開始學(xué)習(xí)吧。
通過這個手冊,我們將帶你參觀如何創(chuàng)建一個基本的投票應(yīng)用。
這個應(yīng)用由兩部分組成:

  • 一個允許人們查看民意調(diào)查并投票的公共網(wǎng)站。
  • 一個允許由你來添加、更改、刪除投票的管理網(wǎng)站。
    我們假設(shè)你已經(jīng)安裝了Django。你可以通過運(yùn)行下面的shell提示符命令來查看Django安裝的版本。(以$作為前綴)

$ python -m django --version

如果Django已經(jīng)安裝了,你就會看到你所安裝的Django的版本。如果沒有安裝成功,則會提示一則錯誤信息“No module named django”(沒有名為django的模塊)。
這個教程適用于Django1.11和Python3.4及以上的版本。如果Django版本不匹配,你可以通過參考手冊底部右下角的版本切換器選擇你的Django版本,或者升級Django為最新版本。如果你仍在使用Python2.7,你需要稍微調(diào)整示例代碼,如評論中所述。
查看 如何安裝Django關(guān)于如何刪除老版本的Django并安裝新版本方面的建議。

到哪里獲取幫助?

如果你在閱讀此教程中遇到了問題,請給 django-users發(fā)送信息,或者訪問 #django on irc.freenode.net和其他可能幫助你的Django開發(fā)者交流。

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

如果這是你第一次使用Django,你必須處理一些初始設(shè)置。也就是說,你需要自動生成一些代碼來建立一個Django項(xiàng)目——就是一個Django實(shí)例的設(shè)置集,它包含了數(shù)據(jù)庫設(shè)置,Django細(xì)節(jié)設(shè)置,以及應(yīng)用細(xì)節(jié)設(shè)置。
通過命令行,cd到你想要存儲代碼的路徑(mysite),然后你就可以運(yùn)行下面這條命令了:

$ django-admin startproject mysite

這就會在你的當(dāng)前路徑下創(chuàng)建一個mysite目錄(就是個文件夾),如果它沒有正常工作,查看 Problems running django-admin

  • 注意:你的項(xiàng)目的命名必須要避開python內(nèi)置包的名字以及Django組件的名字。特別的,這意味著你要避免使用命名像django(將會和Django自己沖突)或者test(將會和Python內(nèi)置包名沖突)
  • 這些代碼應(yīng)該寫在哪里?
    如果你的后端是普通的PHP(沒有使用較新的框架),你可能過去常常把代碼放在web服務(wù)器的根目錄下(比如 /var/www)。在Django中你不必這么做。把所有的python代碼都放在你服務(wù)器的根目錄下并不是一個明智的做法,因?yàn)橐苍S會有一定的風(fēng)險(xiǎn),就是其他人通過網(wǎng)頁能查看的你的代碼,這對安全而言沒有好處。

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

mysite/
-----manage.py
-----mysite/
---------init.py
---------settings.py
---------urls.py
---------wsgi.py

(這里的樹結(jié)構(gòu)畫的不是很清楚,再用語言描述一下,在mysite文件夾中有manage.py文件和mysite文件夾,在mysite文件夾中有init.py、settings.py、urls.py、wsqi.py文件)
這些文件是:

  • 外面的mysite文件夾是根目錄,也是你的項(xiàng)目的容器。它的名字對Django而言并不重要,你可以將其重命名為任何你喜歡的名字。
  • manage.py:一個很實(shí)用的命令行,它使得你和你的Django項(xiàng)目擁有更多的交互方式。你可以在django-admin and manage.py中了解manage.py的所有細(xì)節(jié)。
  • 里面的mysite目錄是關(guān)于你的項(xiàng)目的真實(shí)的python包。它的名字就是python包的名字,你需要使用它導(dǎo)入任何包中的內(nèi)容(例如:mysite.urls)
  • mysite/init.py:這是一個空文件,告訴python這是一個應(yīng)該被認(rèn)為是python的包。如果你是一個python的初學(xué)者,可以在在官方文檔中閱讀more about packages。
  • mysite/settings.py:用來配置Django項(xiàng)目。 Django settings將告訴你所有如何設(shè)置工作的細(xì)節(jié)。
  • mysite/urls.py:為Django項(xiàng)目生命URL。這是一個啟動Django項(xiàng)目的RUL目錄。你可以了解更多在 URL dispatcher中。
  • mysite/wsgi.py:為你的項(xiàng)目提供一個網(wǎng)關(guān)接口兼容的web服務(wù)器的入口,查看 How to deploy with WSGI 的更多細(xì)節(jié)。

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

讓我們來驗(yàn)證Django項(xiàng)目的工作。把目錄更改到外面的mysite路徑,如果你還沒有更改目錄就運(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.
September 06, 2017 - 15:50:53Django version 1.11, using settings 'mysite.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

  • 注意:忽略關(guān)于未應(yīng)用的數(shù)據(jù)庫遷移的警告,我們將馬上處理數(shù)據(jù)庫。

你已經(jīng)啟動了Django開發(fā)服務(wù)器,完全用python編寫的輕量級服務(wù)器。我們已經(jīng)將它和Django包含在一起了,所以你可以快速的開發(fā),而不需要處理服務(wù)器的配置?!拖馎pache服務(wù)器一樣,直到你準(zhǔn)備好生產(chǎn)為止。
現(xiàn)在是值得注意的時候:不要在任何類似于生產(chǎn)環(huán)境的地方使用該服務(wù)器。它只能在開發(fā)時使用。(我們在做web框架的業(yè)務(wù),而不是web服務(wù)器)
現(xiàn)在服務(wù)器正在運(yùn)行,用你的瀏覽器訪問http://127.0.0.1:8000/,你會看見一個呈現(xiàn)出“Welcome to Django”的頁面,令人愉快的淡藍(lán)色背景,它已經(jīng)工作了。

  • 改變端口
    在默認(rèn)設(shè)置中,runserver命令開啟開發(fā)服務(wù)器本地IP的8000端口。
    如果你想改變服務(wù)器的端口,把它作為一個命令參數(shù)。示例:在8080端口上開啟服務(wù)器

$ python manage.py runserver 8080

如果你想改變服務(wù)器的IP,把它和端口號一起作為命令參數(shù)。示例:監(jiān)聽所有可用的公共IP(如果你想運(yùn)行Vagrant 或者你想炫耀可以通過網(wǎng)絡(luò)在其他電腦上工作是很有用的)

$ python manage.py runserver 0:8000

0是0.0.0.0的簡寫方式,開發(fā)服務(wù)器的全部文檔可以在runserver指南中被找到。

  • 自動重新加載runserver
    開發(fā)服務(wù)器根據(jù)需要對python代碼進(jìn)行自動重新加載,你不必為了使修改的代碼生效而重啟服務(wù)器。然而,一些類似于添加文件的操作無法觸發(fā)重新啟動機(jī)制,所以在這些情況下你必須重啟服務(wù)器。

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

目前為止,一個名為“project”的環(huán)境已經(jīng)搭建好了,你可以開始工作了。
你用Django寫的每個應(yīng)用都會包含一個python包,這是約定俗成的。Django有一個實(shí)用的功能就是,自動生成應(yīng)用的基本目錄結(jié)構(gòu),讓你專注于編寫代碼,而不是創(chuàng)建目錄結(jié)構(gòu)。

  • 項(xiàng)目和應(yīng)用程序
    項(xiàng)目和應(yīng)用程序有什么區(qū)別呢?一個應(yīng)用程序就是可以做一些事情的web應(yīng)用——例如,網(wǎng)絡(luò)日志系統(tǒng),一個公共記錄的數(shù)據(jù)庫或者一個簡單的投票應(yīng)用程序。一個項(xiàng)目是配置的集合和一個或者多個特別的網(wǎng)站應(yīng)用程序。

你的應(yīng)用程序可以在python路徑中的任何地方,在本教程中,我們將在你的manage.py文件旁邊創(chuàng)建我們的投票應(yīng)用程序,目的是這樣就可以導(dǎo)入頂級模塊(導(dǎo)入的是mysite)了,而非mysite的子模塊。
為了創(chuàng)建應(yīng)用,請確保你目前所在路徑和manage.py一致,然后輸入如下命令:

$ python manage.py startapp polls

這將會創(chuàng)建一個名為“polls”的目錄,它的目錄結(jié)構(gòu)如下所示:

polls/
------init.py
------admin.py
------apps.py
------migrations/
--------init.py
------models.py
------tests.py
------views.py

(在polls目錄中,有init.py、admin.py、apps.py、models.py、tests.py、view.py和一個migrations文件夾,migrations目錄中有init.py文件)
這個目錄結(jié)構(gòu)將會容納polls應(yīng)用程序。


編寫你的第一個View

讓我們開始寫第一個View吧。打開polls/views.py文件,并且并把下面的python代碼寫進(jìn)去:

#文件 polls/views.py
from django.http import HttpResponse

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

這可能是Django中最簡單的View了。為了調(diào)用view,我們需要把它映射到URL上——如此我們就需要一個URLconf。
為了在polls目錄中創(chuàng)建一個URLconf,創(chuàng)建一個名為“urls.py”的文件,然后你的應(yīng)用程序目錄現(xiàn)在是這樣:

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.conf.urls import url

from . import views

urlpatterns = [
    url(r'^$', views.index, name='index'),
]

下一步就是指向polls.urls模塊的根URLconf,在mysite/urls.py中導(dǎo)入django.conf.urls.include,并在urlpatterns列表中插入一個include()方法,所以你urls.py應(yīng)該如下所示:

#mysite/urls.py
from django.conf.urls import include, url
from django.contrib import admin

urlpatterns = [
    url(r'^polls/', include('polls.urls')),
    url(r'^admin/', admin.site.urls),
]

include()方法允許引用其他URLconfs。值得注意的是,include()方法的正則表達(dá)式?jīng)]有‘$’符號,但是有一個‘/’尾斜杠。無論何時,當(dāng)Django邂逅include()方法時,它可以將URL的任何部分與該點(diǎn)匹配,并將剩余的字符串發(fā)送到包含的URLconf,以便進(jìn)行進(jìn)一步的處理。
include()方法的想法是使URLs“即插即用”,使用起來更簡單。因?yàn)閜olls在他們自己的URLconf中(polls/urls.py),他們可以被置于“/polls/”目錄下,或者“/fun_polls/”下,再或者“/content/polls”,或者其他根路徑,應(yīng)用程序仍然正常工作。

  • 當(dāng)使用include()方法時
    當(dāng)你的項(xiàng)目包含了其他URL patterns時,你應(yīng)該經(jīng)常使用include()方法。admin.site.urls是唯一的例外。
  • 和你看到的不一樣?
    如果你看到的是include(admin.site.urls),而不是admin.site.urls,那么你使用的Django版本可能和本教程不匹配。你可以切換到舊版本的教程,也可以升級Django版本。

現(xiàn)在你已經(jīng)將一個index view連接到了URLconf,讓我們來驗(yàn)證它正在工作,運(yùn)行如下命令:

$ python manage.py runserver

在瀏覽器中訪問 http://localhost:8000/polls/ ,然后你應(yīng)該可以看到文字“Hello, World.You’re at the polls index.”,這是你在index view中定義的內(nèi)容。
url()方法傳遞了4個參數(shù),其中2個是必須的參數(shù):regex和view,其余兩個是可選參數(shù):kwargs和name。這個時候,應(yīng)該回顧一下這些參數(shù)的作用。

url()函數(shù) 參數(shù):regex

這個叫做“regex”的參數(shù)一般來說,意思是“regular expression”(正則表達(dá)式)的縮寫,它是一種匹配字符串模式的一種語法,或匹配ulr模式。Django從第一個正則表達(dá)式開始,然后在列表中從上至下依次對比請求URL和正則表達(dá)式,知道它找到一個匹配的為止。(如果找不到,那么會返回404Error)

  • 注意,這些正則表達(dá)式?jīng)]有搜索GET和POST參數(shù)、域名。舉個例子,一個請求發(fā)送到https://www.example.com/myapp/,URLconf時將會查找 myapp/。一個請求發(fā)送到https://www.example.com/myapp/?page=3,URLconf依然會查找myapp/。
    如果你需要正則表達(dá)式方面的幫助,請看 Wikipedia’s entry,在文檔 re
    模塊也能查到相關(guān)信息。Jeffrey Friedl的《Mastering Regular Expressions》(精通正則表達(dá)式)這本書很棒。然而,在實(shí)踐中,你不必成為一個正則表達(dá)式專家,因?yàn)槟阒恍枰廊绾尾蹲较嗤J郊纯桑ň褪亲屪址ヅ湔齽t表達(dá)式)。事實(shí)上,復(fù)雜的正則表達(dá)式搜索性能很差,所以你不應(yīng)該依賴regexes的全部力量。
    最后,一份性能報(bào)告:這些正則表達(dá)式在URLconf模塊加載后第一時間被編譯,這樣就非??欤ㄖ灰檎也幌裆厦婺菢訌?fù)雜)(作者應(yīng)該是指regex和請求URL的匹配結(jié)果會在URLconf模塊加載后就知道了)。
url()函數(shù) 參數(shù):view

當(dāng)Django發(fā)現(xiàn)了一個匹配的正則表達(dá)式后,Django會調(diào)用指定的view()方法,用一個 HttpRequest
對象作為第一個參數(shù),任何被正則表達(dá)式匹配的值都將作為其他參數(shù)。如果regex使用簡單的匹配模式,那么值將作為位置參數(shù)傳遞;如果它使用命名匹配,那么值將作為關(guān)鍵字參數(shù)。我們會給大家舉個例子。

ulr()函數(shù) 參數(shù):kwargs

任意的關(guān)鍵字參數(shù)都以字典的方式傳遞到目標(biāo)view,我們將在教程中使用這一特性。

url()函數(shù) 參數(shù):name

命名你的URL可以讓你清楚的從Django的其他地方引用它,特別是在模板(tamplate)中。這個強(qiáng)大的功能特性允許你更改全局URL patterns時,只涉及到一個文件。

當(dāng)你對基本的請求和響應(yīng)流感到滿意時(作者可能是指,對基本的請求和響應(yīng)方式有基本的了解時),閱讀教程的第二章開始使用數(shù)據(jù)庫。

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

相關(guān)閱讀更多精彩內(nèi)容

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