摘要:編程從入門到實踐筆記。執(zhí)行命令后,項目的根目錄下會多出一個名為的數(shù)據(jù)庫文件。下面創(chuàng)建一個主題類用戶學(xué)習(xí)的主題返回模型的字符串表示類是中的一個定義了模型基本功能的類。這種交互式環(huán)境稱為,常用語測試項目和排除故障。
《Python編程:從入門到實踐》筆記。1. 前言
從本篇開始將是該書的最后一個項目,將用3篇文章來介紹Django的基礎(chǔ)。完成一個“學(xué)習(xí)筆記”的小網(wǎng)站。
在本篇中,我們將:
用Django來開發(fā)一個名為“學(xué)習(xí)筆記”(Learning Log)的項目;
為這個項目制定規(guī)范,然后為應(yīng)用程序使用的數(shù)據(jù)定義模型;
使用Django的管理系統(tǒng)來輸入一些初試數(shù)據(jù),再學(xué)習(xí)編寫視圖和模板,讓Django能夠為我們的網(wǎng)站創(chuàng)建網(wǎng)頁。
不過在開始之前,請先新建一個虛擬環(huán)境并安裝Django。如果沒有虛擬環(huán)境,通過pip安裝的所有庫都會保存到python的site-packages目錄下。開發(fā)多個項目時,都會用同一個python,而某些項目并不需要其中的所有第三方庫,但如果將這些不需要庫的刪除,又會影響到其他項目。而且,如果A項目需要Django2.0.4,B項目需要Django2.0.0,這該怎么辦?此時就需要虛擬環(huán)境。它其實就相當(dāng)于一個新的文件夾,將新項目與其他項目隔離,本項目的庫不與其他項目的庫相關(guān)聯(lián),類似于操作系統(tǒng)的多用戶概念。
如果使用的是Python 3,可以使用命令:
python -m venv ll_env
如果該命令不成功,可能是沒有安裝virtualenv模塊:
pip install virtualenv
然后創(chuàng)建并激活虛擬環(huán)境:
virtualenv ll_env # linux: source ll_env/bin/activate # windows: ll_envScriptsactivate # 停用: deactivate
管理虛擬環(huán)境的庫還有很多,有興趣的話可以到網(wǎng)上搜一搜。
如果你使用的是新版的PyCharm,那么它在新建項目的時候默認就會創(chuàng)建新的虛擬環(huán)境。
激活虛擬環(huán)境后就可以安裝Django了:
pip install django2. 建立項目 2.1 在Django中創(chuàng)建項目 2.1.1 生成項目
在虛擬環(huán)境中執(zhí)行如下命令:
# 主要最后有個實心句號! # 這個句點讓新項目使用合適的目錄結(jié)構(gòu),這樣開發(fā)完成后可以輕松地將應(yīng)用程序部署到服務(wù)器 django-admin startproject learning_log .
執(zhí)行上述命令后,將多出一個manage.py文件和一個learning_log文件夾,當(dāng)然還有本身的一個ll_env文件夾。
而在learning_log文件夾中,又有四個文件:__init__.py,settings.py,urls.py,wsgi.py。
manage.py是一個簡單的程序,它接收命令并將其交給Django的相關(guān)部分去運行;
settings.py指定Django如何與你的系統(tǒng)交互以及如何管理項目,其實就是配置文件;
urls.py告訴Django應(yīng)創(chuàng)建哪些網(wǎng)頁來響應(yīng)瀏覽器請求;
wsgi.py是web server gateway interface(Web服務(wù)器網(wǎng)關(guān)接口)的縮寫,幫助Django提供它創(chuàng)建的文件。
至于__init__.py,它是個空文件,Python的每個模塊下必須要有這個文件。
2.1.2 創(chuàng)建數(shù)據(jù)庫Django將大部分與項目相關(guān)的信息都存儲在數(shù)據(jù)庫中,所有還需要創(chuàng)建一個供Django使用的數(shù)據(jù)庫。依然是在虛擬環(huán)境下執(zhí)行如下命令:
python manage.py migrate
在PyCharm中的話,可以通過點擊工具欄Tools中的Run manage.py Task(Ctrl+Alt+R),在彈出的命令行中直接輸入原命令中manage.py后面的部分,后面的命令也可以這樣執(zhí)行([appname]是自動提示)。
"migrate"這個單詞其實是遷移的意思,并不是“創(chuàng)建(create)”。之所以使用這個詞,是因為一般將修改數(shù)據(jù)庫的過程稱為遷移數(shù)據(jù)庫(筆者數(shù)據(jù)庫學(xué)得渣,這段解釋直接從書里照搬的,希望哪位大神在留言區(qū)解釋一波)。如果是剛創(chuàng)建的項目,并且第一次執(zhí)行,將會得到如下輸出:
Operations to perform: Apply all migrations: admin, auth, contenttypes, sessions Running migrations: Applying contenttypes.0001_initial... OK -- snip -- Applying sessions.0001_initial... OK
從第2行結(jié)果可以看出,Django將創(chuàng)建和修改數(shù)據(jù)庫看做是對數(shù)據(jù)庫的遷移,Apply all migrations確保數(shù)據(jù)庫結(jié)構(gòu)與當(dāng)前代碼匹配(比如你修改了類的結(jié)構(gòu),添加了屬性,這就相當(dāng)于修改了數(shù)據(jù)表)。
執(zhí)行命令后,項目的根目錄下會多出一個名為db.sqlite3的數(shù)據(jù)庫文件。SQLite是一種使用單個文件的輕量級數(shù)據(jù)庫,常用于開發(fā)簡單應(yīng)用程序,它讓你不用太關(guān)注數(shù)據(jù)庫管理的問題。
2.1.3 運行項目依然在項目的虛擬環(huán)境下輸入如下命令:
python manage.py runserver
得到如下輸出:
Performing system checks... System check identified no issues (0 silenced). April 21, 2018 - 20:46:48 Django version 2.0.4, using settings "learning_log.settings" Starting development server at http://127.0.0.1:8000/ Quit the server with CTRL-BREAK.
現(xiàn)在在瀏覽器中地址欄輸入localhost:8000 (或者127.0.0.1:8000),將得到如下頁面:
這是最新版的Django的默認啟動界面。
2.2 創(chuàng)建應(yīng)用程序(APP) 2.2.1 創(chuàng)建模型Django項目由一系列應(yīng)用程序組成,它們協(xié)同工作,讓項目成為一個整體。我們在項目根目錄下執(zhí)行如下命令,創(chuàng)建一個名為learning_logs的應(yīng)用程序:
python manage.py startapp learning_logs
執(zhí)行命令后,根目錄下會多出一個名為learning_logs的文件夾(筆者第一次接觸Django的時候發(fā)現(xiàn)這玩意兒居然叫做APP,和平時用的手機上的各種APP相差也太大了,很不適應(yīng)),它的結(jié)構(gòu)如下:
重要的是其中的models.py、admin.py和views.py文件,我們將使用models.py來定義我們要在應(yīng)用程序中管理的數(shù)據(jù)。另外兩個文件稍后再介紹。
打開models.py文件,發(fā)現(xiàn)其中自帶兩行代碼:
from django.db import models # Create your models here.
在代碼層面,模型就是一個類,和之前的文章中的類一樣,包含屬性和方法。下面創(chuàng)建一個“主題”類:
from django.db import models class Topic(models.Model): """用戶學(xué)習(xí)的主題""" text = models.CharField(max_length=200) date_added = models.DateTimeField(auto_now_add=True) def __str__(self): """返回模型的字符串表示""" return self.text
Model類是Django中的一個定義了模型基本功能的類。Topic類只有兩個屬性text和date_added。模型中如CharField,DateTimeField這些字段還有很多,Django自動根據(jù)數(shù)據(jù)庫的不同調(diào)用不同的SQL語句創(chuàng)建數(shù)據(jù)表,即屏蔽底層數(shù)據(jù)庫的差異。
同時還重寫了__str__()方法,之所以說“重寫”是因為每個類都有這個方法,當(dāng)直接將一個類A放入print()之類的語句中時,就會調(diào)用A的__str__()方法。如果沒有重寫這個方法,一般會輸出這個對象的內(nèi)存地址之類的,大家可以蘇隨便寫個類試一試。
2.2.2 激活模型使用模型前,必須將APP包含到項目中,打開settings.py文件,將APP添加到INSTALLED_APPS中:
INSTALLED_APPS = [ "django.contrib.admin", "django.contrib.auth", "django.contrib.contenttypes", "django.contrib.sessions", "django.contrib.messages", "django.contrib.staticfiles", # 添加你的app,上面的都是自帶的 "learning_logs.apps.LearningLogsConfig", ]
這里有個需要注意的地方,由于這本書的2016年出版的,當(dāng)時Django還沒有到達2.0版本,所以在書中,注冊APP是這樣寫的:
INSTALLED_APPS = [ -- snip -- # 添加你的app,上面的都是自帶的 "learning_logs", ]
現(xiàn)在官方文檔中是按照第一種方式注冊APP,并且,最新版的Django在新建APP后,在APP的目錄下還多了一個apps.py文件,該文件默認有一個根據(jù)APP名稱創(chuàng)建的類,此處為LearningLogsConfig,內(nèi)容如下:
from django.apps import AppConfig class LearningLogsConfig(AppConfig): name = "learning_logs"
回到主線,在終端中輸入:
python manage.py makemigrations learning_logs # 輸出 Migrations for "learning_logs": learning_logsmigrations