一 Djangao入門
當今的網站實際上都是富應用程序(rich application),就像成熟的桌面應用程序一樣。Python提供了一組開發Web應用程序的卓越工具。在本章中,你將學習如何使用Django(http://djangoproject.com/)來開發一個名為“學習筆記”(Learning Log)的項目,這是一個在線日志系統,讓你能夠記錄所學習的有關特定主題的知識。我們將為這個項目制定規范,然后為應用程序使用的數據定義模型。我們將使用Django的管理系統來輸入一些初始數據,再學習編寫視圖和模板,讓Django能夠為我們的網站創建網頁。
Django是一個Web框架——一套用於幫助開發交互式網站的工具。Django能夠響應網頁請求,還能讓你更輕松地讀寫數據庫、管理用戶等。
1 准備工作
1.1 建立虛擬環境
要使用Django,首先需要建立一個虛擬工作環境。虛擬環境是系統的一個位置,你可以在其中安裝包,並將其與其他Python包隔離。將項目的庫與其他項目分離是有益的,且為了以后將“學習筆記”部署到服務器,這也是必須的。
為項目新建一個目錄,將其命名為learning_log,再在終端中切換到這個目錄,並創建一個虛擬環境。如果你使用的是Python 3,可使用如下命令來創建虛擬環境:
learning_log$ python -m venv ll_env
1.2 激活虛擬環境
建立虛擬環境后,需要使用下面的命令激活它:
命令ll_env\Scripts\activate
1.3 安裝Django
(ll_env)learning_log$ pip install Django
以上三個步驟在我電腦操作為下圖:
1.4 在Django中創建項目
在依然處於活動的虛擬環境的情況下(ll_env包含在括號內),執行如下命令來新建一個項目:
(ll_env)learning_log$ django-admin.py startproject learning_log .
(ll_env)learning_log$ ls
learning_log ll_env manage.py
(ll_env)learning_log$ ls learning_log
__init__.py settings.py urls.py wsgi.py
django-admin.py startproject learning_log .讓Django新建一個名為learning_log的項目。這個命令末尾的句點讓新項目使用合適的目錄結構,這樣開發完成后可輕松地將應用程序部署到服務器。
運行了命令ls(在Windows系統上應為dir),結果表明Django新建了一個名為learning_log的目錄。它還創建了一個名為manage.py的文件,這是一個簡單的程序,它接受命令並將其交給Django的相關部分去運行。我們將使用這些命令來管理諸如使用數據庫和運行服務器等任務。
目錄learning_log包含4個文件,其中最重要的是settings.py、urls.py和wsgi.py。文件settings.py指定Django如何與你的系統交互以及如何管理項目。在開發項目的過程中,我們將修改其中一些設置,並添加一些設置。文件urls.py告訴Django應創建哪些網頁來響應瀏覽器請求。文件wsgi.py幫助Django提供它創建的文件,這個文件名是web server gateway interface(Web服務器網關接口)的首字母縮寫。如下圖:
1.5 創建數據庫
Django將大部分與項目相關的信息都存儲在數據庫中,因此我們需要創建一個供Django使用的數據庫。為給項目“學習筆記”創建數據庫,請在處於活動虛擬環境中的情況下執行下面的命令:
(11_env) D:\study\python\code\learning_log> python manage.py migrate
如下圖:
我們將修改數據庫稱為遷移數據庫。首次執行命令migrate時,將讓Django確保數據庫與項目的當前狀態匹配。在使用SQLite(后面將更詳細地介紹)的新項目中首次執行這個命令時,Django將新建一個數據庫。Django指出它將創建必要的數據庫表,用於存儲我們將在這個項目(Synchronize unmigrated apps,同步未遷移的應用程序)中使用的信息,再確保數據庫結構與當前代碼(Apply all migrations,應用所有的遷移)匹配。Django又創建了一個文件——db.sqlite3。SQLite是一種使用單個文件的數據庫,是編寫簡單應用程序的理想選擇,因為它讓你不用太關注數據庫管理的問題。
1.6 檢查項目
下面來核實Django是否正確地創建了項目。為此,可執行命令runserver,如下所示:
Django啟動一個服務器,讓你能夠查看系統中的項目,了解它們的工作情況。當你在瀏覽器中輸入URL以請求網頁時,該Django服務器將進行響應:生成合適的網頁,並將其發送給瀏覽器。
現在打開一款Web瀏覽器,並輸入URL:http://localhost:8000/;如果這不管用,請輸入http://127.0.0.1:8000/。如下圖:
2 創建應用程序
Django項目由一系列應用程序組成,它們協同工作,讓項目成為一個整體。我們暫時只創建一個應用程序,它將完成項目的大部分工作。在后面,我們將再添加一個管理用戶賬戶的應用程序。
當前,在前面打開的終端窗口中應該還運行着runserver。請再打開一個終端窗口(或標簽頁),並切換到manage.py所在的目錄。激活該虛擬環境,再執行命令startapp:
D:\study\python\code\learning_log>D:\study\python\code\learning_log\11_env\Scripts\activate (11_env) D:\study\python\code\learning_log>dir Volume in drive D is New Volume Volume Serial Number is 98C0-1AEA Directory of D:\study\python\code\learning_log 01/02/2018 04:11 PM <DIR> . 01/02/2018 04:11 PM <DIR> .. 01/02/2018 03:56 PM <DIR> 11_env 01/02/2018 04:11 PM 131,072 db.sqlite3 01/02/2018 04:11 PM <DIR> learning_log 01/02/2018 04:02 PM 559 manage.py 2 File(s) 131,631 bytes 4 Dir(s) 955,714,387,968 bytes free (11_env) D:\study\python\code\learning_log>python manage.py startapp learning_logs (11_env) D:\study\python\code\learning_log>dir Volume in drive D is New Volume Volume Serial Number is 98C0-1AEA Directory of D:\study\python\code\learning_log 01/02/2018 04:31 PM <DIR> . 01/02/2018 04:31 PM <DIR> .. 01/02/2018 03:56 PM <DIR> 11_env 01/02/2018 04:11 PM 131,072 db.sqlite3 01/02/2018 04:11 PM <DIR> learning_log 01/02/2018 04:31 PM <DIR> learning_logs 01/02/2018 04:02 PM 559 manage.py 2 File(s) 131,631 bytes 5 Dir(s) 955,714,383,872 bytes free (11_env) D:\study\python\code\learning_log>dir learning_logs Volume in drive D is New Volume Volume Serial Number is 98C0-1AEA Directory of D:\study\python\code\learning_log\learning_logs 01/02/2018 04:31 PM <DIR> . 01/02/2018 04:31 PM <DIR> .. 01/02/2018 04:31 PM 66 admin.py 01/02/2018 04:31 PM 105 apps.py 01/02/2018 04:31 PM <DIR> migrations 01/02/2018 04:31 PM 60 models.py 01/02/2018 04:31 PM 63 tests.py 01/02/2018 04:31 PM 66 views.py 01/02/2018 04:31 PM 0 __init__.py 6 File(s) 360 bytes 3 Dir(s) 955,714,383,872 bytes free (11_env) D:\study\python\code\learning_log>
命令startapp appname讓Django建立創建應用程序所需的基礎設施。如果現在查看項目目錄,將看到其中新增了一個文件夾learning_logs。打開這個文件夾,看看Django都創建了什么。其中最重要的文件是models.py、admin.py和views.py。我們將使用models.py來定義我們要在應用程序中管理的數據。admin.py和views.py將在稍后介紹。
2.1 定義模型
我們來想想涉及的數據。每位用戶都需要在學習筆記中創建很多主題。用戶輸入的每個條目都與特定主題相關聯,這些條目將以文本的方式顯示。我們還需要存儲每個條目的時間戳,以便能夠告訴用戶各個條目都是什么時候創建的。
from django.db import models # Create your models here. class Topic(models.Model): '''用戶學習的主題''' text = models.CharField(max_length=200) date_added = models.DateTimeField(auto_now_add=True) def __str__(self): '''返回模型的字符串表示''' return self.text
(1)導入了模塊models,還讓我們創建自己的模型。模型告訴Django如何處理應用程序中存儲的數據。在代碼層面,模型就是一個類,就像前面討論的每個類一樣,包含屬性和方法。
(2)Topic類,它繼承了Model——Django中一個定義了模型基本功能的類。Topic類只有兩個屬性:text和date_added。
2.2 激活模型
要使用模型,必須讓Django將應用程序包含到項目中。為此,打開settings.py(它位於目錄learning_log/learning_log中),你將看到一個這樣的片段,即告訴Django哪些應用程序安裝在項目中:
# Application definition INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', #我的應用程序 'learning_logs' ]
這是一個元組,告訴Django項目是由哪些應用程序組成的。請在INSTALLED_APPS中添加:
#我的應用程序 'learning_logs'
接下來,需要讓Django修改數據庫,使其能夠存儲與模型Topic相關的信息。為此,在終端窗口中執行下面的命令:
(11_env) D:\study\python\code\learning_log>python manage.py makemigrations learning_logs Migrations for 'learning_logs': learning_logs\migrations\0001_initial.py - Create model Topic (11_env) D:\study\python\code\learning_log>
命令makemigrations讓Django確定該如何修改數據庫,使其能夠存儲與我們定義的新模型相關聯的數據。輸出表明Django創建了一個名為0001_initial.py的遷移文件,這個文件將在數據庫中為模型Topic創建一個表。下面來應用這種遷移,讓Django替我們修改數據庫:
這個命令的大部分輸出都與我們首次執行命令migrate的輸出相同。我們需要檢查的是最后的輸出行,在這里,Django確認為learning_logs應用遷移時一切正常(OK),每當需要修改“學習筆記”管理的數據時,都采取如下三個步驟:修改models.py;對learning_logs調用makemigrations;讓Django遷移項目。
2.3 Django管理網站
為應用程序定義模型時,Django提供的管理網站(admin site)讓你能夠輕松地處理模型。網站的管理員可使用管理網站,但普通用戶不能使用。在本節中,我們將建立管理網站,並通過它使用模型Topic來添加一些主題。
2.3.1 創建超級用戶
Django允許你創建具備所有權限的用戶——超級用戶。權限決定了用戶可執行的操作。為在Django中創建超級用戶,請執行下面的命令並按提示做:
密碼為:admin123456
2.3.2 向網站注冊模型
Django自動在管理網站中添加了一些模型,如User和Group,但對於我們創建的模型,必須手工進行注冊。我們創建應用程序learning_logs時,Django在models.py所在的目錄中創建了一個名為admin.py的文件,為向管理網站注冊Topic,請輸入下面的代碼:
from django.contrib import admin # Register your models here. from learning_logs.models import Topic admin.site.register(Topic)
這些代碼導入我們要注冊的模型Topic,再使用admin.site.register()讓Django通過管理網站管理我們的模型。現在,使用超級用戶賬戶訪問管理網站:訪問http://localhost:8000/admin/,並輸入你剛創建的超級用戶的用戶名和密碼,這個網頁讓你能夠添加和修改用戶和用戶組,還可以管理與剛才定義的模型Topic相關的數據.如下
2.3.3 添加主題
單擊Topics進入主題網頁,它幾乎是空的,這是因為我們還沒有添加任何主題。單擊Add,你將看到一個用於添加新主題的表單。在第一個方框中輸入Chess,再單擊Save,這將返回到主題管理頁面,其中包含剛創建的主題。下面再創建一個主題,以便有更多的數據可供使用。再次單擊Add,並創建另一個主題RockClimbing。當你單擊Save時,將重新回到主題管理頁面,其中包含主題Chess和Rock Climbing。如下圖:
2.4 定義模型Entry
要記錄學到的國際象棋和攀岩知識,需要為用戶可在學習筆記中添加的條目定義模型。每個條目都與特定主題相關聯,這種關系被稱為多對一關系,即多個條目可關聯到同一個主題。下面是模型Entry的代碼:
from django.db import models # Create your models here. class Topic(models.Model): '''用戶學習的主題''' text = models.CharField(max_length=200) date_added = models.DateTimeField(auto_now_add=True) def __str__(self): '''返回模型的字符串表示''' return self.text class Entry(models.Model): '''學到的有關某個主題的具體知識''' topic = models.ForeignKey(Topic,on_delete=models.CASCADE) text = models.TextField() date_added = models.DateTimeField(auto_now_add=True) class Meta: verbose_name_plural ='entries' def __str__(self): """返回模型的字符串表示""" return self.text[:50] + "..."
書中這句date_added = models.DateTimeField(auto_now_add=True)會報錯,改成上面的即可。
2.5遷移模型
由於我們添加了一個新模型,因此需要再次遷移數據庫。你將慢慢地對這個過程了如指掌:修改models.py , 執行命令python manage.py makemigrations app_name , 再執行命令pythonmanage.py migrate。
2.6 向管理網站注冊Entry
我們還需要注冊模型Entry。為此,需要將admin.py修改成類似於下面這樣:
from django.contrib import admin from learning_logs.models import Topic, Entry admin.site.register(Topic) admin.site.register(Entry)
返回到http://localhost/admin/,你將看到learning_logs下列出了Entries。單擊Entries的Add鏈接,或者單擊Entries再選擇Add entry。你將看到一個下拉列表,讓你能夠選擇要為哪個主題創建條目,還有一個用於輸入條目的文本框。從下拉列表中選擇Chess,並添加一個條目。下面是我添加的第一個條目。
再來創建一個國際象棋條目,並創建一個攀岩條目,以提供一些初始數據。下面是第二個國際象棋條目。繼續往下開發“學習筆記”時,這三個條目可為我們提供使用的數據。
2.7 Django shell
輸入一些數據后,就可通過交互式終端會話以編程方式查看這些數據了。這種交互式環境稱為Django shell,是測試項目和排除其故障的理想之地。下面是一個交互式shell會話示例:
在活動的虛擬環境中執行時,命令python manage.py shell啟動一個Python解釋器,可使用它來探索存儲在項目數據庫中的數據。
今天就先寫到這里吧,有空繼續學習!