Django 1.10中文文件-第一個應用Part1-請求與響應
目錄[-]
在本教程中,我們將引導您完成一個投票應用程式的建立,它包含下面兩部分:
- 一個可以進行投票和檢視結果的公開站點;
- 一個可以進行增刪改查的後臺admin管理介面;
我們假設你已經安裝了Django。您可以通過執行以下命令來檢視Django版本以及驗證是否安裝:
python -m django --version
如果安裝了Django,您應該將看到安裝的版本。如果沒有安裝,你會得到一個錯誤,提示No module named django
。
本教程是為Django 1.10和Python 3.4或更高版本編寫的。如果Django版本不匹配,您可以去官網參考您的對應Django版本的教程,或者將Django更新到最新版本。
如果你仍然在使用Python 2.7,你需要稍微調整程式碼,注意程式碼中的註釋。
建立project
如果這是你第一次使用Django,你將需要處理一些初始設定。也就是說,這會自動生成一些建立Django專案的程式碼,但是你需要設定一些配置,包括資料庫配置,Django特定的選項和應用程式特定的設定等等。
從命令列,cd
進入您將存放專案程式碼的目錄,然後執行以下命令:
django-admin startproject mysite # mysite為專案名
如果執行出錯,請參見Problems running django-admin。這將在目錄下生成一個mysite目錄,也就是你的這個Django專案的根目錄。它包含了一系列自動生成的目錄和檔案,具備各自專有的用途。
注意: 在給專案命名的時候必須避開Django和Python的保留關鍵字。比如“django”(它會與Django本身衝突)或“test”(它與一個內建的Python包衝突)。 這些程式碼應該放在哪兒? 如果你曾經學過普通的舊式的PHP(沒有使用過現代的框架),你可能習慣於將程式碼放在Web伺服器的文件根目錄下(例如/var/www)。使用Django時,建議你不要這麼做。 將Python程式碼放在你的Web伺服器的根目錄不是個好主意,因為這可能會有讓其他人看到你的程式碼的風險。
一個新建立的專案結構大概如下:
mysite/ manage.py mysite/ __init__.py settings.py urls.py wsgi.py
這些檔案分別是:
- 外層的mysite/根目錄僅僅是專案的一個容器。它的命名對Django無關緊要;你可以把它重新命名為任何你喜歡的名字;
- manage.py:一個命令列工具,可以使你用多種方式對Django專案進行互動。 你可以在django-admin和manage.py中讀到關於manage.py的所有細節;
- 內層的mysite/目錄是你的專案的真正的Python包。它的名字是你引用內部檔案的包名(例如 mysite.urls);
-
mysite/__init__.py
:一個空檔案,它告訴Python這個目錄應該被看做一個Python包; - mysite/settings.py:該Django專案的配置檔案。具體內容可以參見Django settings;
- mysite/urls.py: 路由檔案,相當於你的Django站點的“目錄”。 你可以在URL轉發器中閱讀到關於URL的更多內容;
- mysite/wsgi.py:用於你的專案的與WSGI相容的Web伺服器入口。用作服務部署,更多細節請參見如何利用WSGI進行部署。
開發伺服器
讓我們驗證一下你的Django專案是否工作。 進入外層的mysite目錄,然後執行以下命令:
python manage.py runserver
你將在看到如下輸出:
Performing system checks...
System check identified no issues (0 silenced).
You have 13 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
January 09, 2017 - 16:22:02
Django version 1.10.2, using settings 'Django_learn.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.
注意:現在忽略有關未應用資料庫遷移的警告;下面教程將很快處理資料庫
這表明你已經啟動了Django開發伺服器,一個用純Python寫的輕量級Web伺服器。 我們在Django中內建了它,這樣你就可以在不配置用於生產環境的伺服器(例如Apache)的情況下快速開發出產品,直到你準備好上線。
請注意:不要在任何生產環境使用這個伺服器。它僅僅是用於在開發中使用。(我們的重點是編寫Web框架,非Web伺服器。)
既然伺服器已經執行,請用你的瀏覽器訪問 http://127.0.0.1:8000。 在淡藍色背景下,你將看到一個“Welcome to Django”的頁面。 It worked!
修改埠號
預設情況下,runserver命令在內部IP的8000埠啟動開發伺服器。
如果你需改變伺服器的埠,把要使用的埠作為一個命令列引數傳遞給它。 例如,這個命令在8080埠啟動伺服器:
python manage.py runserver 8080
如果你需改變伺服器的IP地址,把IP地址和埠號放到一起。 因此若要監聽所有的外網IP,請使用(如果你想在另外一臺電腦上展示你的工作,會非常有用):
python manage.py runserver 0.0.0.0:8000
runserver的自動過載
在Debug模式下,開發伺服器會根據需要自動重新載入Python程式碼。 你不必為了使更改的程式碼生效而重啟伺服器。 然而,一些行為比如新增檔案,不會觸發伺服器的重啟,所以在這種情況下你需要手動重啟伺服器。
建立投票app
你編寫的每個Django應用都是遵循特定約定且包含一個Python包。 Django自帶這個功能,它可以自動生成應用的基本目錄結構(就像建立專案那樣)
project和app區別:
- 一個app實現某個功能,比如部落格、公共檔案資料庫或者簡單的投票系統;
- 一個project是配置檔案和多個app的集合,他們組合成整個站點;
- 一個project可以包含多個app;
- 一個app可以屬於多個project。
app的存放位置可以是任何地點,但是通常我們將它們都放在與manage.py同級目錄下,這樣方便匯入檔案。
進入mysite目錄,確保與manage.py檔案處於同一級,並且鍵入以下命令來建立你的app:
python manage.py startapp polls # polls為app的name
這將建立一個目錄polls,它的結構如下:
polls/
__init__.py
admin.py
apps.py
migrations/
__init__.py
models.py
tests.py
views.py
編寫檢視
讓我們寫第一個檢視。開啟檔案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中最簡單的檢視。要呼叫檢視,我們需要將它對映到一個URL,為此,我們需要一個URLconf。
要在polls目錄中建立一個URLconf,在polls資料夾中建立一個名為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'),
]
你可以看到專案根目錄下的mysite目錄也有個urls.py檔案,下一步是讓這個專案的主urls.py檔案指向我們建立的polls這個app獨有的urls.py檔案,開啟mysite/urls.py檔案,你需要先匯入include模組,程式碼如下:
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地址去除了它前面的正則表示式,將剩下的字串傳遞給下一級路由進行判斷。
include的背後是一種即插即用的思想。專案根路由不關心具體app的路由策略,只管往指定的二級路由轉發,實現瞭解耦的特性。app所屬的二級路由可以根據自己的需要隨意編寫,不會和其它的app路由發生衝突。app目錄可以放置在任何位置,而不用修改路由。這是軟體設計裡很常見的一種模式。
您現在已將索引檢視連線到URLconf。讓我們驗證它的工作,執行以下命令:
python manage.py runserver
在瀏覽器中訪問http//localhost8000/polls/,你應該看到文字“Hello, world. You're at the polls index.“,就如你在view.py中定義的那樣。
url()函式可以傳遞4個引數,其中2個是必須的:regex和view,以及2個可選的引數:kwargs和name。下面是具體的解釋:
url() 引數:regex
regex是正則表示式的通用縮寫,它是一種匹配字串或url地址的語法。Django拿著使用者請求的url地址,在urls.py檔案中對urlpatterns列表中的每一項條目從頭開始進行逐一對比,一旦遇到匹配項,立即執行該條目對映的檢視函式或二級路由,其後的條目將不再繼續匹配。因此,url路由的編寫順序至關重要!
需要注意的是,regex不會去匹配GET或POST引數或域名,例如對於https://www.example.com/myapp, regex只嘗試匹配myapp/。對於https://www.example.com/myapp/?page=3, regex也只嘗試匹配myapp/
url() 引數:view
當正則表示式匹配到某個條目時,自動將封裝的HttpRequest物件作為第一個引數,正則表示式“捕獲”到的值作為第二個引數,傳遞給該條目指定的檢視。如果是簡單捕獲,那麼捕獲值將作為一個位置引數進行傳遞,如果是命名捕獲,那麼將作為關鍵字引數進行傳遞。
url() 引數:kwargs
任意數量的關鍵字引數可以作為一個字典傳遞給目標檢視。
url() argument: name
對你的URL進行命名,可以讓你能夠在Django的任意處,尤其是模板內顯式地引用它。相當於給URL取了個全域性變數名,你只需要修改這個全域性變數的值,在整個Django中引用它的地方也將同樣獲得改變。這是極為古老、樸素和有用的設計思想,而且這種思想無處不在。