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