Django1.11版本的官方教程翻譯。
讓我們一起通過一個例子學習Django。
通過這個教程,我會帶著你們手把手教你完成一個基礎的民意調(diào)查web應用。
這個應用包括兩個部分:
- 一個公共站點,讓人們?yōu)g覽投票情況,并投出自己的一票
- 一個管理站點,讓你添加,修改,刪除投票
我們假設你已經(jīng)安裝好了Django。你可以在通過一條命令行指令看看自己是否已經(jīng)安裝Django以及是什么版本的Django。
python -m django --version
如果Django已經(jīng)安裝,你會看到你安裝的版本的版本號。如果沒有,你會得到一條警告寫到"No module named django"。
這個教程基于Django 1.11和Python 3.4及以后。如果Django版本不匹配,你可以去官方網(wǎng)站查看你的版本的對應教程,或者把你的Django更新到最新版本(譯者注:1.11應該是Django1.x版本的最后一個長期支持版本)。如果你還在使用Python 2.7,你得稍微修改修改教程內(nèi)的代碼。(譯者注:Python 3.x已經(jīng)是主流了,并且一定是日后的主流,盡早使用沒毛病。)
關于安裝和更新Django請查看如何安裝Django。
創(chuàng)建你的第一個項目
如果這是你第一次使用Django,你得注意一些開始步驟。也就是說,你需要自動運行一些用來創(chuàng)建Django項目的代碼,一個Django示例的設置合集,包括database configuration(數(shù)據(jù)庫配置),Django-specific Options(Django選項)和application-specific settings(應用設置)。
從命令行使用cd進入你想要保存你的代碼的目錄,然后運行以下命令:
django-admin startproject mysite
這條命令會在當前目錄中創(chuàng)建一個mysite目錄。如果這沒有用,請查看使用Django的那些問題。
注意:你不能使用一些Python和Django內(nèi)置的元素名來命名你的Django項目。比如你不應該使用像Django或者test這樣的名字來命名自己的項目。
這個代碼應該放在哪?
把任何Python代碼放在你的Web服務器的文檔根目錄里都并不是一個明智的做法,因為有可能會讓別人通過網(wǎng)絡看到你的代碼,這不太安全。
把,你的代碼放在根目錄之外,比如/home/mycode
來,我們看看剛剛的startproject創(chuàng)建了什么?
mysite/ manage.py mysite/ __init__.py settings.py urls.py wsgi.py
-最外面的mysite/根目錄只是一個項目的容器,Django對這個名字并不在乎,你可以隨便改名字。
-manage.py:一個命令行程序,幫助你通過各種方式和Django交互。你可以去Django-admin和manage.py查看所有的相關細節(jié)。
-里面的mysite/目錄是你項目真正的Python包。你會需要用這個名字來import里面的東西。(比如 mysite.urls)
-mysite/__init__.py:一個空的文件,告訴Python這整個目錄應該被看做一個Python包,如果你對Python也是個新手,可以去查看Python官方文檔。
-mysite/settings.py:關于這個Django項目的配置??梢渣c擊后面的鏈接查看細節(jié)。Django settings
-mysite/urls.py:這個Django項目的URL聲明。一個你的Django站點的目錄。你可以查看官方文檔查看更多細節(jié)URL dispatcher
-mysite/wsgi.py:WSGI兼容的Web服務器為您的項目提供服務的入門點。有關詳細信息,請參閱如何使用WSGI進行部署。
開發(fā)服務器
來,我們檢驗一下自己的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. April 04, 2017 - 15:50:53Django version 1.11, 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.
現(xiàn)在你已經(jīng)啟動了Django的開發(fā)服務器,一個完全用python寫成的輕量級Web服務器。我們將這個服務器包括在Django內(nèi),開發(fā)者就不用費功夫去調(diào)試一個像Apache那樣的服務器了。這樣來幫助開發(fā)者快速開發(fā)。
現(xiàn)在,我必須提醒一下大家:不要在任何類似生產(chǎn)環(huán)境中使用這個服務器。這個服務器只用于開發(fā)(官方注:我們只是搞Web框架開發(fā)的,不是搞Web服務器開發(fā)的。)
現(xiàn)在,服務器已經(jīng)運行了。通過你的瀏覽器訪問http://127.0.0.1:8000/。
你會看到一個舒服的淺藍色的Django歡迎頁面。我們成功了!
更換借口
默認情況下,會在內(nèi)部IP的8000端口啟動開發(fā)服務器。
如果你想更換服務器端口,請通過命令行傳遞參數(shù)。比如使用8080端口
python manage.py runserver 8080
如果你想改變服務器IP,請將其和端口一起傳遞。例如,要監(jiān)聽所有可用的公共IP(如果你在使用Vagrant或者想炫耀你的工作),請使用:
python manage.py runserver 0:8000
0是0.0.0.0的快捷方式。開發(fā)服務器的完整文檔可以在runserver參考中找到。
自動重新加載服務器
開發(fā)服務器根據(jù)需要自動為每個請求重新加載Python代碼。你不需要重新啟動服務器以使代碼更改生效。但是,一些操作(如添加文件)不會觸發(fā)重新啟動,因此在這些情況下您必須重新啟動服務器。
創(chuàng)建投票Web應用
現(xiàn)在,你的環(huán)境 - 一個“項目” - 已經(jīng)建立起來,你已經(jīng)可以真正開始工作了。
你在Django中編寫的每個應用程序都包含了一個遵循一定約定的Python包。 Django自帶一個實用程序,可以幫助你自動生成應用程序的基本目錄結(jié)構,因此您可以專注于編寫代碼而不是不停的創(chuàng)建目錄。
項目project和應用App?
這兩個的區(qū)別是什么?
一個app是一個用于實現(xiàn)某個功能的Web應用,比如,一個網(wǎng)絡博客系統(tǒng),一個公共記錄數(shù)據(jù)庫,或是一個簡單的投票應用。
一個project是為了一個網(wǎng)站的一系列的配置和應用的集合。
一個project可以保護多個app。
一個app可以存在于多個project里。
你的應用程序可以存在于Python路徑的任何位置。在本教程中,我們會在manage.py的旁邊建立這個投票應用,這樣它就可以作為這個項目的頂級模塊,而不是一個簡單的子模塊。
為了創(chuàng)建app,請確保你在manage.py的目錄里,然后輸入以下命令
python manage.py startapp polls
然后我們就成功創(chuàng)建了一個目錄,叫做polls。
目錄的結(jié)構是這樣的:
polls/ __init__.py admin.py apps.py migrations/ __init__.py models.py tests.py views.py
這個目錄就會存放我們的投票應用。
完成你的第一個視圖view
現(xiàn)在讓我們一起寫我們的第一個視圖view。打開polls/views.py這個文件,然后寫入下面的Python代碼。
from django.http import HttpResponse
def index(request): return HttpResponse("Hello, world. You're at the polls index.")
這應該是Django中最簡單的視圖了。為了調(diào)用它,我們需要將它映射到一個URL,因此我們需要一個URLconf。
我們應該在polls目錄中創(chuàng)建一個叫做urls.py的文件。
在這個文件中應該包含以下代碼:
from django.conf.urls import url
from . import views
urlpatterns = [ url(r'^$', views.index, name='index'), ]
下一步,我們應該將根URLconf指向我們的polls.urls模塊。在mysite/urls.py中,加入django.conf.urls.include,并且將我們的polls.urls加入urlpatterns。
你的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()函數(shù)允許引用其他URLconf。請注意,include()函數(shù)的正則表達式不具有$(字符串結(jié)尾匹配字符),而是尾部斜線。每當Django遇到include()時,它會排除與該點匹配的任何部分,并將剩余的字符串發(fā)送到包含的URLconf進行進一步處理。
include()的背后的想法是URL可以即插即用。由于民意調(diào)查是在自己的URLconf(polls / urls.py)中,它們可以放在“/ polls /”下或“/ fun_polls /”下或“/ content / polls /”或其他路徑根目錄下,應用程序仍然可以工作。
什么時候使用include()
當你想要導入其他的URL時,請使用include()。admin.site.urls是唯一的例外。
你看到的和教程里的不太一樣?
如果你在你的文件里看到了include(admin.site.urls)而不是admin.site.urls應該是你使用了的Django版本不是1.11,而是其他的。
你已經(jīng)將索引視圖連接到了URLconf中。讓我們來檢驗一下工作吧。輸入以下命令行命令。
python manage.py runserver
用你的瀏覽器去 http://localhost.8000/polls/ ,然后你應該會看到
“Hello, world. You’re at the polls index.”
這是你的index view里定義的。
url()函數(shù)傳遞四個參數(shù),regex和view是必須的,kwargs和name是可選的。我大概介紹一下他們的作用。
-
regex參數(shù)
regex是regular expression(正則表達式)的常用的簡寫。它是用于匹配字符串中的模式的語法,或者在這個例子中,用來匹配url的模式。Django從第一個正則表達式開始,并將其放在列表中,將請求的URL和每一個正則表達式比對,選出匹配的。
請注意,這些正則表達式不搜索GET和POST參數(shù)或域名。例如,在https://www.example.com/myapp/ 的請求中,URLconf將尋找myapp/。在https://www.example.com/myapp/?page=3的請求中,URLconf還將查找myapp/。
如果不太明白正則表達式,請參閱維基百科的條目或者re模塊的文檔。此外O’Reilly系列書中的《掌握正則表達式》也非常棒。實際操作中,你并不需要成為正則表達式的專家,因為您只需要知道如何捕獲簡單的模式。實際上,復雜的正則表達式的查找性能會很差,所以你可能不應該依靠正則表達式的全部功能。
最后,一個有關性能的說明:這些正則表達式是第一次加載URLconf模塊時會被編譯。因此它們超級快(只要查找不是太復雜)。
2.view參數(shù)
當Django找到了一個正則表達式進行匹配時,Django會調(diào)用指定的視圖函數(shù),使用HttpRequest作為第一個參數(shù),并且將正則表達式中捕獲的值作為其他參數(shù)。如果正則表達式 使用簡單的捕獲值,則值作為位置參數(shù)傳遞;如果使用命名捕獲,則值作為關鍵字參數(shù)傳遞。稍后會給出例子解釋。
-
kwargs參數(shù)
任意關鍵詞參數(shù)(keyword arguments)可以在字典中傳遞到目標視圖。我們不會在教程中使用Django的這個功能。
4.name參數(shù)
命名你的URL,方便你在Django的其他地方明確的引用他,特別是模版中。這個強大的功能可以讓你全面更改項目的URL模式,而且只接觸一個文件。
如果這章基本明白了,請開始本教程的第二部分,開始學習數(shù)據(jù)庫相關的知識。