Python 項目實踐三(Web應用程序)第一篇


一 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解釋器,可使用它來探索存儲在項目數據庫中的數據。

今天就先寫到這里吧,有空繼續學習!


免責聲明!

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



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