Django官方手冊--1

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

讓我們用一個示例來開始學習吧。
通過這個手冊,我們將帶你參觀如何創建一個基本的投票應用。
這個應用由兩部分組成:

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

$ python -m django --version

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

到哪里獲取幫助?

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

創建一個項目

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

$ django-admin startproject mysite

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

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

讓我們看一下 startproject創建了什么:

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

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

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

開發服務器

讓我們來驗證Django項目的工作。把目錄更改到外面的mysite路徑,如果你還沒有更改目錄就運行了下面的命令:

$ 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.

  • 注意:忽略關于未應用的數據庫遷移的警告,我們將馬上處理數據庫。

你已經啟動了Django開發服務器,完全用python編寫的輕量級服務器。我們已經將它和Django包含在一起了,所以你可以快速的開發,而不需要處理服務器的配置。——就像Apache服務器一樣,直到你準備好生產為止。
現在是值得注意的時候:不要在任何類似于生產環境的地方使用該服務器。它只能在開發時使用。(我們在做web框架的業務,而不是web服務器)
現在服務器正在運行,用你的瀏覽器訪問http://127.0.0.1:8000/,你會看見一個呈現出“Welcome to Django”的頁面,令人愉快的淡藍色背景,它已經工作了。

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

$ python manage.py runserver 8080

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

$ python manage.py runserver 0:8000

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

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

創建投票應用

目前為止,一個名為“project”的環境已經搭建好了,你可以開始工作了。
你用Django寫的每個應用都會包含一個python包,這是約定俗成的。Django有一個實用的功能就是,自動生成應用的基本目錄結構,讓你專注于編寫代碼,而不是創建目錄結構。

  • 項目和應用程序
    項目和應用程序有什么區別呢?一個應用程序就是可以做一些事情的web應用——例如,網絡日志系統,一個公共記錄的數據庫或者一個簡單的投票應用程序。一個項目是配置的集合和一個或者多個特別的網站應用程序。

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

$ python manage.py startapp polls

這將會創建一個名為“polls”的目錄,它的目錄結構如下所示:

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文件)
這個目錄結構將會容納polls應用程序。


編寫你的第一個View

讓我們開始寫第一個View吧。打開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.")

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

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中導入django.conf.urls.include,并在urlpatterns列表中插入一個include()方法,所以你urls.py應該如下所示:

#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()方法的正則表達式沒有‘$’符號,但是有一個‘/’尾斜杠。無論何時,當Django邂逅include()方法時,它可以將URL的任何部分與該點匹配,并將剩余的字符串發送到包含的URLconf,以便進行進一步的處理。
include()方法的想法是使URLs“即插即用”,使用起來更簡單。因為polls在他們自己的URLconf中(polls/urls.py),他們可以被置于“/polls/”目錄下,或者“/fun_polls/”下,再或者“/content/polls”,或者其他根路徑,應用程序仍然正常工作。

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

現在你已經將一個index view連接到了URLconf,讓我們來驗證它正在工作,運行如下命令:

$ python manage.py runserver

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

url()函數 參數:regex

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

  • 注意,這些正則表達式沒有搜索GET和POST參數、域名。舉個例子,一個請求發送到https://www.example.com/myapp/,URLconf時將會查找 myapp/。一個請求發送到https://www.example.com/myapp/?page=3,URLconf依然會查找myapp/。
    如果你需要正則表達式方面的幫助,請看 Wikipedia’s entry,在文檔 re
    模塊也能查到相關信息。Jeffrey Friedl的《Mastering Regular Expressions》(精通正則表達式)這本書很棒。然而,在實踐中,你不必成為一個正則表達式專家,因為你只需要知道如何捕捉相同模式即可(就是讓字符串匹配正則表達式)。事實上,復雜的正則表達式搜索性能很差,所以你不應該依賴regexes的全部力量。
    最后,一份性能報告:這些正則表達式在URLconf模塊加載后第一時間被編譯,這樣就非常快(只要查找不像上面那樣復雜)(作者應該是指regex和請求URL的匹配結果會在URLconf模塊加載后就知道了)。
url()函數 參數:view

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

ulr()函數 參數:kwargs

任意的關鍵字參數都以字典的方式傳遞到目標view,我們將在教程中使用這一特性。

url()函數 參數:name

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

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,002評論 6 542
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,400評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,136評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,714評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,452評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,818評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,812評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,997評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,552評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,292評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,510評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,035評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,721評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,121評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,429評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,235評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,480評論 2 379

推薦閱讀更多精彩內容