1. 程式人生 > >碼出你的第一個Django app——Django官方教程(一)

碼出你的第一個Django app——Django官方教程(一)

碼出你的第一個Django app,第一部分

讓我們通過例項來學習。

這個教程會帶領你建立一個基礎的投票應用。

本教程由兩部分組成:

  • 一個供使用者檢視和投票的公共站點
  • 一個供管理員對投票進行增刪改查的站點

我們假設你已經安裝好了Django。你可以用以下命令確定Django是否已經安裝好並且檢視其版本:

$ python -m django --version

如果Django已經安裝好,你會看到你所安裝的版本。如果沒有安裝好,你會看到錯誤資訊“No module named django”。

這篇教程是寫給Django 1.10和Python 3.4或更新的版本的。如果Django的版本不匹配,你可以在

本頁的右下角的版本選擇工具處找到你所使用版本對應的教程,或者把你的Django更新到最新的版本。如果你仍然在使用Python 2.7,你需要像註釋裡所描述的那樣對程式碼進行微調。

在哪裡尋求幫助

如果你在學習本教程中碰到了難題,請傳送一個資訊給django-users或者訪問freenode.net去和其他的Django使用者討論,看是否有人能幫助你。

建立一個工程

如果這是你第一次使用Django,你需要注意一些初始化好的設定。也就是說,你需要自動生成一些建立Django工程的程式碼——一批對一個Django例項的配置,包括資料庫配置,Django特定的選項和應用特定的配置。

在命令列中,cd進入一個你想存放你的程式碼的目錄,然後執行下面的命令:

$ django-admin startproject mysite

當你給工程取名時,應當避免與Python的內建庫或者Django的模
塊重名。特別說明一下,就是說你得避免取像django這樣的名字(這與Django自身相沖突)或
test這樣的名字(這與Python的內建包衝突)。

該把程式碼放在哪?

如果從前你從事樸素的PHP的開發(不使用時髦的框架),你可能曾經把程式碼放到Web伺服器的root檔案裡(一個類似於/var/www的地方)。使用Django時,你不能再那樣做了。把Python程式碼全放在root檔案裡不是個好主意,因為其他人可能會通過Web去看你的原始碼。這很不安全。

讓我們看看startproject都建立了什麼吧

mysite/
    manage.py
    mysite/
        __init__.py
        settings.py
        urls.py
        wsgi.py

這些檔案是:

  • 外層的mysite/根目錄僅作為你工程的容器。它的名字對Django沒有任何影響;你可以隨便對它進行重新命名。
  • manage.py:一個命令列工具,它提供多種方式讓你與Django進行互動。你可以在django-admin and manage.py閱讀有關manage.py的所有細節。
  • 內層的mysite/目錄是你工程的真正的Python包。它的名字是Python包名,在引用(import)檔案的時候你都會用到它(比如mysite.urls)。
  • mysite/__init__.py:一個空檔案,它的作用是告訴Python這個目錄需要被認作是一個Python包。如果你是個Python初學者,請在Python的官方文件裡閱讀more about packages
  • mysite/settings.py:Django工程的設定/配置檔案。Django settings這篇文章會告訴你它是如何工作的。
  • mysite/urls.py:這個Django工程的URL宣告;可以理解為你的Django驅動的站點的“目錄”。你可以在URL dispatcher閱讀更多關於URLs的相關內容。
  • mysite/wsgi.py:一個WSFI-compatible Web伺服器的入口。可以檢視 How to deploy with WSG瞭解更多細節。

開發伺服器

讓我們來證實一下你的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.

November 04, 2016 - 15:50:53
Django version 1.10, using settings 'mysite.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.


先忽略掉這個有關未應用資料庫搬移的警告吧;我們稍後再處理有關資料庫的問題。

你已經開啟了Django的開發伺服器——一個用純Python寫的輕量級的Web伺服器。我們把它整合在了Django裡以便於你很快的開發應用,不用先糾結於配置一個發行伺服器——比如Apache——直到你已經寫好了程式碼準備上線。

現在我得說明一點:不要把這個伺服器用到任何生產環境中。它僅僅是給開發過程使用的。(我們是做Web框架的,不是搞Web服務的。)

現在伺服器已經執行起來了,用你的瀏覽器訪問http://127.0.0.1:8000/。你會看到令人愉悅的,淺藍色的“Welcome to Django”頁。它好使!

更改埠

在預設的情況下,runserver命令在8000埠開啟服務。

如果你想更改服務埠,給它傳一個命令列引數。舉個例子,下面這條命令將在8080埠開啟服務:

$ python manage.py runserver 8080

如果你想更改服務的IP,那麼把它同埠一起作為引數。這樣來監聽所有的公共IP(如果你想通過其他電腦來檢視你的作品),使用:

$ python manage.py runserver 0.0.0.0:8000

runserver的自動重新載入

這個開發伺服器會在每次處理請求的時候自動重新載入Python程式碼。你在修改程式碼後不用重啟服務就能生效。可是,像新增檔案這種操作不會引發自動載入,所以在這種情況下你得手動重啟一下服務。

建立投票app

現在你的環境——一個“project”——已經建立完畢,現在要做的是開始真正的工作。

每一個用Django寫的應用都遵循一個確定的規則來建立Python包,Django提供一個工具可以自動生成一個app的基礎目錄結構,這樣你就能專心於程式碼的寫作而不是規劃目錄。

Project vs. app

Project和app的區別在哪裡呢?App是一個具有特定效用的Web應用,比如說一個日誌系統,或是一個公共記錄亦或是一個簡單的投票應用。而project是許多app和相關配置組合起來的一個獨特的網路站點。一個project能包含許多app。一個app可以被許多project所使用。

你的app可以放在你的Python path能找到的任何地方。在本教程中,我們把投票app建立在和manage.py同級的目錄裡,這樣它就能被當作自己的頂層模組被引用(import),而不是mysite的子模組。

在建立app之前,確保命令執行在manage.py的同級目錄下:

$ python manage.py startapp polls

這條命令建立了一個名為polls的目錄,完全展開如下:

polls/
    __init__.py
    admin.py
    apps.py
    migrations/
        __init__.py
    models.py
    tests.py
    views.py

我們將用這個目錄結構來組建應用。

碼出第一個檢視(view)

開始寫第一個view吧!開啟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,所以我們需要一個URL的配置檔案(URLconfs)。

在polls目錄下建立一個名為urls.py的URL配置檔案吧。你的app目錄現在應該是這個樣的:

polls/
    __init__.py
    admin.py
    apps.py
    migrations/
        __init__.py
    models.py
    tests.py
    urls.py
    views.py

把下面這段程式碼放到polls/urls.py裡:

from django.conf.urls import url

form . import views

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

下一步要做的是在根URL配置(root URLconf)裡註冊polls.urls模組。在mysite/urls.py中,增加對django.conf.urls.include的引用(import),然後在urlpatterns列表裡增加一則include(),此時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()函式能夠呼叫其它的URL配置檔案(URLconfs)。可以看到給include()配置的正則表示式結尾並不是$(匹配結尾的字元)而是一個反斜槓。每當Django遇到include(),他就會把已匹配的部分砍掉然後把剩下的部分傳入被include的URL配置檔案(URLconf)裡進一步匹配。

include()被設計的目的是為了方便我們掌控URL。只要polls的相關URL在配置檔案裡(polls/urls.py)配置好了,那麼這個配置檔案被放在哪裡就無所謂了,他可以被放在“/polls/”,或是“/fun_pulls/”,亦或“/content/polls/”等等,app都能夠正常的工作。

何時使用inlcude()

當引用其他URL配置(URL patterns)的時候都要使用此函式。admin.site.urls是唯一的例外。

我說的跟你看到的驢脣不對馬嘴?

如果你所看到的是include(admin.site.urls)而不是admin.site.urls,你可能正在使用一個老版本的Django,這個教程並不適合。你可以選擇去找老版的教程,或者,更新你的Django版本。

現在你已經在URLconf裡繫結好了一個index view。那麼就來證實一下好使不好使吧!執行下面這則命令:

$ python manage.py runserver

用瀏覽器訪問http://localhost:8000/polls/,你會看到你在index view裡定義的字樣:“Hello, world. You’re at the polls index.”。

url()函式有四個引數,兩個是必須的:regexview,還有兩個是可選的:kwargsname。現在我們有必要去看看這四個引數都是做什麼的。

url()的引數regex

“regex”是“regular expression”(正則表示式)的簡寫,正則表示式是一種對字串進行模式匹配的語法,當然在這裡,它是用來匹配一定格式的URL的。Django收到使用者發來的請求URL後,會在列表裡用正則表示式對它挨個進行匹配,直到找到一個匹配成功。

如果你不太懂正則表示式,可以去看一下Wikipedia’s entry或者去看看re模組的文件。還有,Jeffrey Fried寫的O’Reilly book“Mastering Regular expressions”也不錯。當然在這裡你不必要十分精通正則表示式,只要知道怎樣去匹配常用的模式就好了。事實上,複雜的正則匹配的查詢能力並不盡如人意,所以你不必太過依賴它。

最後,一個性能說明:這些正則表示式會在URLconf模組載入的時候被編譯。它們非常快(在不像上文中提到的十分複雜的情況下)。

url()的引數view

當Django用一個正則表示式匹配成功了請求的URL,Django就會呼叫一個特定的view函式,把HttpRequest物件當作這個函式的第一個引數,其餘通過正則“捕獲”的值作為其他引數。如果是簡單的匹配,引數會是下標的形式;如果是通過名字匹配,引數會是鍵值對的形式。我們一會兒會通過例子來介紹這些。

url()的引數kwargs

隨意的鍵值對引數,它們會以字典的形式被提交到指向的view。本教程不使用這個功能。

url()的引數name

在Django中給你的URL命名可以讓你很方便的在別的地方使用它,尤其是在模板中。這強大的功能可以讓你僅僅修改一個URL模組檔案就能讓這個改變全域性生效。

如果你對本部分介紹的請求響應流程已經理解,那麼就請開啟本教程的第二部分(譯者注:這是源連結)對資料庫操作的學習吧!

譯者:

經常聽老師說外國文獻雖然都很厚,但是都是非常易懂的言語,確實如此。各位不妨移步去看官網的英文原版教程。如果真的十分頭疼英語而且覺得我翻譯的還能看,但是我還沒更新,就請催更吧^_^!