003 編寫你的第一個(gè) Django 應(yīng)用

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

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

它將由兩部分組成:

  • 一個(gè)讓人們查看和投票的公共站點(diǎn)。
  • 一個(gè)讓你能添加、修改和刪除投票的管理站點(diǎn)。

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

$ python -m django --version

如果這行命令輸出了一個(gè)版本號(hào)恢恼,證明你已經(jīng)安裝了此版本的 Django民傻;如果你得到的是一個(gè)“No module named django”的錯(cuò)誤提示,則表明你還未安裝厅瞎。

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

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

從哪里獲得幫助:

如果你在閱讀本教程的過程中有任何疑問吴菠,可以> 前往FAQ的:doc:Getting Help</faq/help> 的版塊。

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

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

打開命令行怎燥,cd 到一個(gè)你想放置你代碼的目錄瘫筐,然后運(yùn)行以下命令:

$ django-admin startproject mysite

這行代碼將會(huì)在當(dāng)前目錄下創(chuàng)建一個(gè) mysite 目錄。如果命令失敗了铐姚,查看 運(yùn)行 django-admin 時(shí)遇到的問題策肝,可能能給你提供幫助。

這行代碼將會(huì)在當(dāng)前目錄下創(chuàng)建一個(gè) mysite 目錄隐绵。如果命令失敗了之众,查看 運(yùn)行 django-admin 時(shí)遇到的問題,可能能給你提供幫助依许。

注解

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

我的代碼該放在哪帘睦?

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

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

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

$ tree mysite
mysite
├── manage.py
└── mysite
    ├── __init__.py
    ├── asgi.py
    ├── settings.py
    ├── urls.py
    └── wsgi.py

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

  • 最外層的 mysite/ 根目錄只是你項(xiàng)目的容器, 根目錄名稱對(duì)Django沒有影響夭谤,你可以將它重命名為任何你喜歡的名稱棺牧。
  • manage.py: 一個(gè)讓你用各種方式管理 Django 項(xiàng)目的命令行工具。你可以閱讀 django-admin and manage.py 獲取所有 manage.py 的細(xì)節(jié)朗儒。
  • 里面一層的 mysite/ 目錄包含你的項(xiàng)目颊乘,它是一個(gè)純 Python 包。它的名字就是當(dāng)你引用它內(nèi)部任何東西時(shí)需要用到的 Python 包名醉锄。 (比如 mysite.urls).
  • mysite/__init__.py:一個(gè)空文件乏悄,告訴 Python 這個(gè)目錄應(yīng)該被認(rèn)為是一個(gè) Python 包。如果你是 Python 初學(xué)者恳不,閱讀官方文檔中的 更多關(guān)于包的知識(shí)檩小。
  • mysite/settings.py:Django 項(xiàng)目的配置文件。如果你想知道這個(gè)文件是如何工作的烟勋,請(qǐng)查看 Django 配置 了解細(xì)節(jié)规求。
  • mysite/urls.py:Django 項(xiàng)目的 URL 聲明,就像你網(wǎng)站的“目錄”神妹。閱讀 URL調(diào)度器 文檔來獲取更多關(guān)于 URL 的內(nèi)容颓哮。
  • mysite/asgi.py:作為你的項(xiàng)目的運(yùn)行在 ASGI 兼容的Web服務(wù)器上的入口。閱讀 如何使用 ASGI 來部署 了解更多細(xì)節(jié)鸵荠。
  • mysite/wsgi.py:作為你的項(xiàng)目的運(yùn)行在 WSGI 兼容的Web服務(wù)器上的入口冕茅。閱讀 如何使用 WSGI 進(jìn)行部署 了解更多細(xì)節(jié)。

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

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

$ python manage.py runserver

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

<pre class="literal-block" style="font-family: &quot;Fira Mono&quot;, Consolas, Menlo, Monaco, &quot;Courier New&quot;, Courier, monospace; font-size: 14px; white-space: pre-wrap; overflow-wrap: break-word; font-variant-ligatures: no-common-ligatures; text-rendering: optimizespeed; color: rgb(12, 75, 51); border: 1px solid rgb(234, 234, 234); background: rgb(248, 248, 248); overflow: auto; border-radius: 4px; margin: 25px 0px; padding: 10px 20px; font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">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.

十一月 28, 2020 - 15:50:53
Django version 3.1, 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.</pre>

注解

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

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

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

現(xiàn)在茶凳,服務(wù)器正在運(yùn)行,瀏覽器訪問 https://127.0.0.1:8000/播揪。你將會(huì)看到一個(gè)“祝賀”頁面贮喧,隨著一只火箭發(fā)射,服務(wù)器已經(jīng)運(yùn)行了猪狈。

更換端口

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

如果你想更換服務(wù)器的監(jiān)聽端口罪裹,請(qǐng)使用命令行參數(shù)饱普。舉個(gè)例子,下面的命令會(huì)使服務(wù)器監(jiān)聽 8080 端口:

$ python manage.py runserver 8080

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

python manage.py runserver 0:8000

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

會(huì)自動(dòng)重新加載的服務(wù)器 runserver

用于開發(fā)的服務(wù)器在需要的情況下會(huì)對(duì)每一次的訪問請(qǐng)求重新載入一遍 Python 代碼碾牌。所以你不需要為了讓修改的代碼生效而頻繁的重新啟動(dòng)服務(wù)器康愤。然而,一些動(dòng)作舶吗,比如添加新文件征冷,將不會(huì)觸發(fā)自動(dòng)重新加載,這時(shí)你得自己手動(dòng)重啟服務(wù)器誓琼。

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

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

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

項(xiàng)目 VS 應(yīng)用

項(xiàng)目和應(yīng)用有什么區(qū)別复濒?應(yīng)用是一個(gè)專門做某件事的網(wǎng)絡(luò)應(yīng)用程序——比如博客系統(tǒng)脖卖,或者公共記錄的數(shù)據(jù)庫,或者小型的投票程序巧颈。項(xiàng)目則是一個(gè)網(wǎng)站使用的配置和應(yīng)用的集合胚嘲。項(xiàng)目可以包含很多個(gè)應(yīng)用。應(yīng)用可以被很多個(gè)項(xiàng)目使用洛二。

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

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

$ python manage.py startapp polls

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

$ tree polls
polls
├── __init__.py
├── admin.py
├── apps.py
├── migrations
│   └── __init__.py
├── models.py
├── tests.py
└── views.py

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

編寫第一個(gè)視圖

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

from django.http import HttpResponse


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

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

為了創(chuàng)建 URLconf陶耍,請(qǐng)?jiān)?polls 目錄里新建一個(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 中,輸入如下代碼:

from django.urls import path

from . import views

urlpatterns = [
    path('', views.index, name='index'),
]

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

from django.contrib import admin
from django.urls import include, path

urlpatterns = [
    path('polls/', include('polls.urls')),
    path('admin/', admin.site.urls),
]

函數(shù) include() 允許引用其它 URLconfs。每當(dāng) Django 遇到 include() 時(shí)毯欣,它會(huì)截?cái)嗯c此項(xiàng)匹配的 URL 的部分馒过,并將剩余的字符串發(fā)送到 URLconf 以供進(jìn)一步處理。

我們?cè)O(shè)計(jì) include() 的理念是使其可以即插即用酗钞。因?yàn)橥镀睉?yīng)用有它自己的 URLconf( polls/urls.py )腹忽,他們能夠被放在 "/polls/" , "/fun_polls/" 算吩,"/content/polls/"留凭,或者其他任何路徑下,這個(gè)應(yīng)用都能夠正常工作偎巢。

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

你現(xiàn)在把 index 視圖添加進(jìn)了 URLconf压昼。通過以下命令驗(yàn)證是否正常工作:

$ python manage.py runserver

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

函數(shù) path() 具有四個(gè)參數(shù)匠题,兩個(gè)必須參數(shù):routeview拯坟,兩個(gè)可選參數(shù):kwargsname。現(xiàn)在韭山,是時(shí)候來研究這些參數(shù)的含義了郁季。

path() 參數(shù):

route

route 是一個(gè)匹配 URL 的準(zhǔn)則(類似正則表達(dá)式)。當(dāng) Django 響應(yīng)一個(gè)請(qǐng)求時(shí)钱磅,它會(huì)從 urlpatterns 的第一項(xiàng)開始梦裂,按順序依次匹配列表中的項(xiàng),直到找到匹配的項(xiàng)盖淡。

這些準(zhǔn)則不會(huì)匹配 GET 和 POST 參數(shù)或域名年柠。例如,URLconf 在處理請(qǐng)求 https://www.example.com/myapp/ 時(shí)褪迟,它會(huì)嘗試匹配 myapp/ 冗恨。處理請(qǐng)求 https://www.example.com/myapp/?page=3 時(shí),也只會(huì)嘗試匹配 myapp/味赃。

view

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

kwargs

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

name

為你的 URL 取名能使你在 Django 的任意地方唯一地引用它吠谢,尤其是在模板中土童。這個(gè)有用的特性允許你只改一個(gè)文件就能全局地修改某個(gè) URL 模式。

當(dāng)你了解了基本的請(qǐng)求和響應(yīng)流程后工坊,請(qǐng)閱讀 教程的第 2 部分 開始使用數(shù)據(jù)庫.

這部分教程從 教程第 1 部分 結(jié)尾的地方繼續(xù)講起献汗。我們將建立數(shù)據(jù)庫,創(chuàng)建您的第一個(gè)模型王污,并主要關(guān)注 Django 提供的自動(dòng)生成的管理頁面罢吃。

從哪里獲得幫助:

如果你在閱讀本教程的過程中有任何疑問,可以前往FAQ的:doc:Getting Help</faq/help> 的版塊昭齐。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末尿招,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌就谜,老刑警劉巖怪蔑,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異丧荐,居然都是意外死亡缆瓣,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門虹统,熙熙樓的掌柜王于貴愁眉苦臉地迎上來弓坞,“玉大人,你說我怎么就攤上這事车荔≈绯螅” “怎么了?”我有些...
    開封第一講書人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵夸赫,是天一觀的道長。 經(jīng)常有香客問我咖城,道長茬腿,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任宜雀,我火速辦了婚禮切平,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘辐董。我一直安慰自己悴品,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開白布简烘。 她就那樣靜靜地躺著苔严,像睡著了一般。 火紅的嫁衣襯著肌膚如雪孤澎。 梳的紋絲不亂的頭發(fā)上届氢,一...
    開封第一講書人閱讀 51,182評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音覆旭,去河邊找鬼退子。 笑死,一個(gè)胖子當(dāng)著我的面吹牛型将,可吹牛的內(nèi)容都是我干的寂祥。 我是一名探鬼主播,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼七兜,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼丸凭!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤贮乳,失蹤者是張志新(化名)和其女友劉穎忧换,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體向拆,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡亚茬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了浓恳。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片刹缝。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖颈将,靈堂內(nèi)的尸體忽然破棺而出梢夯,到底是詐尸還是另有隱情,我是刑警寧澤晴圾,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布颂砸,位于F島的核電站,受9級(jí)特大地震影響死姚,放射性物質(zhì)發(fā)生泄漏人乓。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一都毒、第九天 我趴在偏房一處隱蔽的房頂上張望色罚。 院中可真熱鬧,春花似錦账劲、人聲如沸戳护。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽腌且。三九已至,卻和暖如春榛瓮,著一層夾襖步出監(jiān)牢的瞬間切蟋,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來泰國打工榆芦, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留柄粹,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓匆绣,卻偏偏與公主長得像驻右,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子崎淳,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353

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