Tango with django 1.9 中文——3.Django基礎


讓我們開始運用Django。本章主要是給你一個關於創建新項目和新應用過程的概覽。在本章的末尾,你將建立起一個簡單的由Django驅動的網站。

3.1 配置測試

讓我們測試以下你的Python和Django安裝是否滿足本教程的要求。首先,打開新的命令行窗口並輸入以下命令,查看安裝的Python版本。

$ python --version

顯示的python版本應該是2.7.5+ 或者 3.4+。

如果使用虛擬環境,記得先激活它。

接下來檢查Django安裝,在命令行窗口中輸入以下命令,運行Python:

$ python
Python 2.7.10 (default, Jul 14 2015, 19:46:27)
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.39)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>

接着在提示符處輸入以下命令:

>>> import django
>>> django.get_version()
'1.9.10'
>>> exit()

一切順利的話,你會看到正確的Django版本,然后用exit()指令退出Python解釋器。如果導入django失敗,檢查一下虛擬環境,在命令行窗口中用pip list指令查看該環境下安裝了哪些包。

如果在安裝Django的過程中遇到了苦難,或者安裝了不同版本,可以參考系統設置章節或者官方文檔中的安裝指南

提示

在本書中,你需要留意代碼片段中包含的兩個東西。

以美元符號($)開頭的代碼,表示這是命令行指令。

以>>>開頭的代碼,是需要輸入到Python解釋器的。$ python$ py可以啟動解釋器。退出解釋器的命令是exit()或者quit()

3.2 創建Django項目

進入你的工作區目錄,發布以下指令:

$ django-admin.py startproject tango_with_django_project

如果還沒有工作區目錄,可以建立一個,這樣你可以把你的Django項目和其他代碼項目存放在這個目錄中。我們將用<workspace>引用你的工作區目錄,你需要將它轉換成自己實際的目錄,比如 /Users/leifos/Code/ 或者 /Users/maxwelld90/Workspace/。

找不到 django-admin.py?

試試輸入django-admin 看看。根據你的設置,有些系統可能不認識 django-admin.py。

對於Windows,你可能必須輸入django-admin.py的完整路徑,比如:

python c:\python27\scripts\django-admin.py startproject tango_with_django_project

這個命令將調用django-admin.py文件,為你創建一個叫做 tango_with_django_project 的項目。通常,我們在Django項目目錄后面加上后綴_project,使之意義明確。當然,具體怎么命名你自己說了算。

你會在工作區中看到一個新建的 tango_with_django_project 目錄。在這個新目錄中,有兩樣東西:

  • 另一個跟項目同名的目錄 tango_with_django_project;
  • 一個叫做 manage.py 的Python文件。

我們將這個嵌入的tango_with_django_project目錄稱為項目配置目錄。在這個目錄中,你可以看到四個Python文件。稍后我們會具體討論這些文件,現在先了解一下:

  • _init_.py,一個空白的Python文件,用來告訴解釋器該目錄是一個Python包;
  • settings.py,儲存所有Django項目設置的地方;
  • urls.py,儲存項目URL模式的Python文件;
  • wsgi.py,用於運行開發服務器和將你的項目部署到生成環境。

在項目目錄中,還有另外一個文件manage.py。我們在開發項目的過程中將總要調用它。它提供了一系列讓你可以維護你的Django項目的指令。比如,manage.py 允許你運行Django內建的開發服務器,測試你的應用程序,運行各種數據庫指令等。事實上,我們想運行的大多數Django命令,基本都會用到這個文件。

Django Admin 和 Manage

如果想要深入了解Django admin文件,可以參考官方文檔的Admin and Manage scripts

運行 python manage.py help命令,可以查看可用的命令列表。

現在你可以通過下面的指令來試試manage.py文件:

$ python manage.py runserver

運行該指令將啟動Python,並通知Django初始化它的輕量級開發服務器。在命令行窗口中應該可以看到類似下面的輸出:

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

October 2, 2016 - 21:45:32
Django version 1.9.10, using settings 'tango_with_django_project.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

在輸出信息中,我們可以看到很多東西。首先,沒有問題阻礙程序運行。第二,有一個警告信息,unapplied migrations 未實施的數據遷移。我們將在設置數據庫章節深入討論它,現在暫時忽略。第三,最重要的一點,Django開發服務器的地址被指定為URL http://127.0.0.1:8000/

現在,打開你的網頁瀏覽器然后輸入地址http://127.0.0.1:8000/ ,看到的應該是類似下面的情況:

![ch3-django-powered-page](E:\Python3 Learning\books\tango_with_django_19-master\tango_with_django_19-master\manuscript\images\ch3-django-powered-page.png)

你可以隨時通過在命令行窗口中輸入 CTRL+C 命令來停止開發服務器。如果你希望在不同的端口上運行開發服務器,或者允許用戶從其他機器上訪問,你可以通過設置一些可選參數來達成。例如下面的命令:

$ python manage.py runserver <your_machines_ip_address>:5555

執行這條命令將使開發服務器回應TCP端口5555上的請求。你需要把<your_machines_ip_address>替換成你自己電腦的IP地址或者127.0.0.1。

不知道自己的IP地址?

如果使用0.0.0.0,Django會顯示出你的IP地址。不妨試試:

python manage.py runserver 0.0.0.0:5555

當設置端口時,不要使用80或者8080端口,因為它們習慣上用於HTTP通信。還有,所有1024以下端口都被認為是操作系統保留的,不要使用。

在你的網絡中的其他機器上,也可以演示你的應用。配置開發服務器的地址為你電腦的IP,然后在其他機器上進入http://<your_machine_ip_address>:<port>/就可以瀏覽你的網站。當然,這還涉及到你所在網絡的具體設置。可能有代理服務器或者防火牆需要配置。如果你不能遠程瀏覽你的網站,請與你的網絡管理員聯系確認。

3.3 建立Django App

每個Django項目是組成特定網絡應用或網站的一些配置文件和app的集合。通過開發一些app,然后可以將其復用到不同的項目中,只造成很小的影響。這種方法很好的促進了軟件工程化。

每個Django app有自己特定的任務。你需要建立一些為你的網站提供特定功能的app。比如,我們可以假設一個項目可能包括以下app:一個投票app,一個注冊app,以及一個指定內容相關app。在另一個項目中,我們可能想復用投票和注冊app,這樣我們就可以把這兩個app包括在第二個項目中。稍后我們詳細討論。眼下我們先建立一個Rango app。

首先,用命令行窗口在你的工作區目錄中運行以下命令:

$ python manage.py startapp rango

startapp命令在你的項目根目錄中創建一個叫做rango的新目錄,它包含以下Python文件:

  • 又一個_init_.py,與前文討論的功能一樣;
  • admin.py,在這里你可以注冊你的模型,然后享受Django便利的管理界面;
  • apps.py,所有app的具體配置;
  • models.py,儲存app數據模型;
  • tests.py,儲存app代碼的測試函數;
  • views.py,處理請求並響應;
  • migrations 目錄,模型的數據庫具體信息;

views.py 和 models.py 在任何app中都要用到,並組成Django的主要建造設計模式,即 Model-View_template 模式。你可以參考官方文檔,了解模型、視圖和模板具體是怎么關聯到一起的。

在開始建立你自己的模型和視圖之前,你得先讓你的Django項目知道新app的存在。這需要在項目配置目錄中,修改settings.py文件。打開該文件,找到 INSTALLED_APPS元組。將rango app添加到元組的末尾,像下面這樣:

INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rango',
]

重啟開發服務器,如果沒有出現錯誤,那么rango app已經納入項目,你可以進入下一個步驟。

startapp魔法

當用python manage.py startapp命令創建新app時,Django可能會自動將app名稱添加到setting.py文件中的 INSTALLED_APPS 列表中。盡管如此,在繼續深入之前,檢查一下看所有東西是否都設置正確是一個良好的做法。

3.4 建立視圖

現在Rango app已經建立了,現在我們建立一個簡單的視圖。作為我們的第一個視圖,我們不妨先只返回一些文本內容到客戶端——暫時先不考慮使用模型和模板。

在你的IDE中,打開新建的rango app目錄中的views.py文件。刪除注釋`# Create your views here.,這樣你就有了一個空白文件。

現在你可以添加以下代碼:

from django.http import HttpResponse

def index(request):
    returen HttpResponse("Rango says hey there partner!")

分解這三行代碼:

  • 我們首先從django.http模塊導入HttpResponse對象;
  • views.py文件中的每個視圖都是相互獨立的函數。在這個實例中,我們只建立了一個視圖,叫做index。
  • 每個視圖至少具有一個參數——一個HttpRequest對象。按照常規,這是一個已命名的請求,但是你可以按照自己的意願重命名。
  • 每個視圖必須返回一個HttpResponse對象。一個簡單的HttpResponse對象具有一個字符串參數,用於描述客戶端請求的視圖頁面上下文。

當視圖建立好以后,距離用戶可以訪問它還有其他步驟。為了讓用戶看到你的視圖,你必須將一個Uniform Resurece Locator(URL)映射到該視圖:

打開項目目錄中的urls.py文件,鍵入以下urlpatterns代碼,來建立一個入門級映射:

from rango import views

urlpatterns=[
    url(r'^$',view.index,name='index'),
    url(r'^admin/',admin.site.urls),
]

這將rango app的index視圖映射到基礎URL上。運行開發服務器,訪問http://127.0.0.1:8000, 或你設置的其他開發服務器地址。你將看到index視圖渲染過的輸出頁面。

3.5 映射URLs

除了將URLs直接從項目映射到app,我們可以通過改變視圖的接入URL,將我們的app更加模塊化(然后可以復用)。首先,我們需要修改項目的urls.py文件,將它指向Rango app來處理所有涉及Rango app的請求。然后我們需要指定Rango怎么處理這些請求。

首先,打開項目配置目錄中的項目urls.py文件。該路徑相對於你的工作區目錄,應該為 <workspace>/tango_with_django_project/tango_with_django_project/urls.py。將urlpatterns更新為下面這樣:

from django.conf.urls import url
from django.contrib import admin
from django.conf.urls import include
from rango import views

urlpatterns = [
	url(r'^$', views.index, name='index'),
	url(r'^rango/', include('rango.urls')),
    #以上映射將所有開頭為 rango/ 的URL指向rango應用。
	url(r'^admin/', admin.site.urls),
	]

Django框架將urlpatterns設計成一個Python列表。添加的映射查找能匹配^rango/模式的URL字符串。當匹配成功后,該URL字符串的其他部分將通過include()函數(來自django.conf.urls)傳遞到rango.urls處理。

URL chain

將這想象成一個訪問URL字符串的URL鏈——如上面的URL鏈圖。在這個鏈中,域名被去掉,URL字符串的其他部分(rango/)被傳遞到tango_with_django項目,然后找到匹配模式並去掉rango/,剩余一個空字符串傳遞到rango應用,供其操作。

接下來,我們需要在rango應用的目錄下建立一個新文件叫做urls.py,用來處理剩下的URL字符串(將控制富川映射到index視圖):

from django.conf.urls import url
from rango import views

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

這段代碼引入了URL映射相關的Django組件以及rango的views模塊。這使我們可以調用url函數,並將urlpatterns中的映射指向index視圖。

當我們談論URL字符串時,我們認為給出的URL主機部分已經被去掉了。URL主機部分表示映射到網絡服務器的主機地址或者域名,比如http://127.0.0.1:8000 或者 http://www.tangwithdjango.com。去掉主機部分意為着Django組件只需要處理剩余的URL字符串。舉個例子,給出的URL為http://127.0.0.1:8000/rango/about/,Django得到的URL字符串為 /rango/about/。

我們創建的URL映射調用Django的url()函數,其中第一個參數是正則表達式 ^$ ,它匹配的是空字符串。因為^表示字符串開頭,$表示字符串結尾,首尾之間沒有任何東西,所以只能匹配空字符串。用戶提供的任何可以匹配該表達式的URL字符串將調用視圖函數 views.index()。你可能會想,匹配一個空的URL沒有任何用處——使用它干嘛?記住,這不是整個空的URL,只是URL字符串中的一部分。這是因為Django首先在項目urls.py中的正則表達式(比如 rango/)中匹配原始字符串,成功后去掉 rango/部分。然后Django將剩下的空字符串傳遞到rango應用,再通過rango/urls.py中的正則表達式匹配。

下一個傳遞給url()函數的參數是index視圖,它將處理傳入的請求。再后的是一個可選參數name,它被設置為字符串'index'。通過命名URL映射,后面我們可以使用反向URL匹配。這樣我們可以通過名稱而不是URL引用URL映射。下文建立模板時我們將解釋怎么使用它。更多信息可以參考官方文檔的相關章節

現在,重啟Django開發服務器,訪問http://127.0.0.1:8000/rango/。如果一切順利,你應該看到文本<Rango says hey there partner!>。如下面的截屏:

about page

在每個app中,你將會創建很多URL映射。這個入門的映射相當簡單,但是隨着本書的深入,我們將建立一些更復雜、更參數化的URL映射。

領會Django時怎么處理URLs也是很重要的。現在它可能看起來很令人困惑,但是隨着教程深入,我們會建立越來越多的URL映射,所以你很快就會成為專家。更多具體信息和實例請參考URLs官方文檔

正則表達式

Django URL模式使用正則表達式進行匹配。花時間熟悉怎么在python中使用正則表達式是很值得的。Python官方文檔包含了一個良好的正則表達式指南。另外regexcheatsheet.com 提供了一個整潔的通用表達式概覽

如果你正在使用版本控制,現在是一個推送工作區更改的好時機。

3.6 基本工作流程

本章中所學習的內容可以簡單概括為一個步驟列表。這里,我們提供你所完成的兩個主要任務的列表。以后當你需要復習某些步驟時,可以回頭看本小節。

創建新的Django項目

  1. 通過命令$ python django-admin.py startproject <name>創建項目,<name>是你的項目名稱。

創建新的Django應用

  1. 通過命令$ python manage.py startapp <appname>創建app,<appname>是你的應用名稱。
  2. 將新建的app添加到項目settings.py文件中的INSTALLED_APPS元組中,讓Django認識你的app。
  3. 在項目urls.py文件中,添加指向app的映射。
  4. 在app目錄中新建urls.py文件,處理傳入的URL字符串,指定視圖。
  5. 在app目錄的views.py中,創建請求的視圖,確保它們返回一個HttpResponse對象。

練習

現在你可以運行Django和你的新app,完成下面的練習,鞏固你所學的知識。到達這個階段是學習Django的一個重大里程碑。創建視圖和指向視圖的URL映射,是開發更復雜和可以復用的網絡應用的第一步。

  • 復習本章,確保你了解了URL是怎么映射到視圖的。
  • 創建一個叫做about的新視圖,返回HttpResponse對象:<'Rango says here is the about page.'>
  • 將這個視圖映射到 /rango/about。對於這一步,你只需要編輯Rango app的urls.py文件。注意/rango/部分由項目urls.py處理。
  • 修改index視圖的HttpResponse對象,使之包含一個指向about頁面的鏈接。
  • 修改about視圖的HttpResponse對象,使之包含一個指向index頁面的鏈接。
  • 現在你真正開始學習本書了,作者的Twitter @tangowithdjano

提示

如果你感覺很難完成以上練習,以下這些提示應該可以提供靈感去解決它們。

  • 在views.py中,建立一個函數,def about(request):,使它返回一個HttpResponse對象,將你的HTML插入這個對象。
  • 在rango/urls.py中添加新的映射到about()視圖,用來匹配 的正則表達式為 `r'^about/' 。
  • 更新你的index()視圖,加入指向about視圖的鏈接。可以像這樣:Rango says hey there partner! <br/><a href='/rango/about/'>About</a>
  • 在about()視圖中也加上可以返回主頁面的鏈接<a href="/rango/">Index</a>
  • 如果你還沒度過Django官方教程的第一部分,現在是時候停下來去讀了。(譯者注:中文版的教程可以參考博客園大江東流大神的博客


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM