Django -- 從平凡到超凡

第 2 章    設定開發環境

(1) 應用程式的開發、測試、與上線

∗ 應用程式的開發流程與環境

▸ 流程:系統開發 系統測試 系統營運

開發流程

▸ 開發環境 (Development environment):應用程式開發的環境,包含以下

✶ 執行環境 (即後端程式語言及所使用的各種套件)
✶ Web 框架
✶ 整合式開發環境 (Integrated Development Environment, IDE)
✶ 開發用資料庫系統
✶ 版本控制

▸ 測試環境 (Testing environment):應用程式測試的環境,包含以下

✶ 執行環境
✶ Web 框架
✶ 測試工具
✶ 測試用資料庫系統
✶ 版本控制

▸ 生產環境 (Production environment):應用程式正式上線的環境,包含以下

✶ 執行環境
✶ Web 框架
✶ 版本控制
✶ 生產用資料庫系統
✶ 系統日誌
✶ 效能、流量、負載平衡
✶ 備份
✶ 安全監控
版本控制

(2) 框架

∗ 框架 (Framework)

▸ 框架:一個規範嚴謹的架構,指定哪種程式可以建構、以何種方式建構,並指定這些程式如何互動

▸ 迫使開發者必須以框架所規範的模式來撰寫應用程式,以提昇程式的一致性

▸ 亦提供許多函式庫,以提昇系統開發速度、系統效能、以及系統安全

∗ 框架和函式庫 (Library) 的不同

▸ 函式庫:應用程式控制主要流程,並在需要時呼叫函式庫裡的函式 (例如:呼叫 print() 函式)

▸ 框架:框架控制主要流程,並在需要時呼叫應用程式裡的函式 (框架亦提供函式庫讓應用程式呼叫)

∗ Web 框架 (Web framework)

▸ 負責處理大部分的 HTTP 請求,當需要時呼叫應用程式裡的函式

回呼模式

▸ 上述的架構也稱為「處理器回呼模式」(Handler callback pattern):

框架執行大多數的工作,在需要時回頭呼叫我們的程式以完成部份工作

∗ Django 框架

▸ 以 Python 程式語言為基礎的高階框架,用來開發 Web 系統

▸ 快速的系統開發,乾淨且實用的設計

▸ 開源軟體,社群活躍,功能強大,文件完整,維護品質佳

▸ 處理大多數系統開發的細節,讓開發者專注在自己的應用程式

▸ 標語:The web framework for perfectionists with deadlines. (有時間壓力的完美主義者最適合的框架)

宣稱

Ridiculously fast (超乎想像的速度)
Reassuringly secure (再三保證的安全)
Exceedingly scalable (超級卓越的延展性)

▸ 設計理念:

✶ 鬆散耦合 (Loosely coupled):系統各個元素彼此保持獨立,相互依賴性低
✶ 少寫程式 (Less coding):開發者只需要撰寫少量程式,開發速度超快
✶ 不要自我重複 (Don't Repeat Yourself, DRY):程式盡量保持唯一,不要一再複製
✶ 快速開發 (Fast development):超快速的開發時程
✶ 乾淨的設計 (Clean design):以最佳的實務解決方案來設計 Django,保持程式與架構的簡潔

▸ 以 Django 建構的知名大型網站:YouTube, Dropbox, Google, Quora, Instagram, Spotify, Reddit, Yahoo Maps, Mozilla, NASA, Pinterest, The Guardian, Washington Post, ...

(3) 設定開發環境

∗ 設定開發環境是開發專案的第一個工作,所需完成的項目為:

▸ 規劃並建立專案目錄架構

▸ 安裝 Python 3 程式語言

▸ 安裝 Postgres 資料庫系統

▸ 安裝 virtualenv 虛擬環境產生程式

▸ 安裝及設定 IDE

∗ 規劃專案目錄架構

▸ 一個 Web 系統常包含有千百個檔案,有好的目錄架構,系統元件彼此之間的關係才會簡潔而不雜亂

▸ 我們打算將整個目錄架構規劃如下 (假設有許多專案 proj1, proj2, ...):

webapps/
   git/
      proj1/
         .git/      # proj1 專案的版本控制目錄
         proj1/     # 版本控制後的 proj1 專案目錄
      proj2/
         .git/      # proj2 專案的版本控制目錄
         proj2/     # 版本控制後的 proj2 專案目錄 
      ...
   virtualenv/
      proj1Venv/   # proj1 專案的虛擬環境目錄
      proj2Venv/   # proj2 專案的虛擬環境目錄
      ...
   workspace/
      proj1/       # 版本控制前的 proj1 專案目錄,進入版本控制後移至 git/proj1 目錄下
      proj2/       # 版本控制前的 proj2 專案目錄,進入版本控制後移至 git/proj2 目錄下
      ... 
✶ 其中 webapps 為最上層目錄 (Web applications 的縮寫) ,其位置由開發者決定,例如:
# Ubuntu:放在家目錄 /home/<username> 之下
# Windows:放在使用者目錄 C:\Users\<username> 之下
# Mac:/Users/<username>
以上 <username> 是登入作業系統的使用者名稱
webapps 目錄包含 3 個子目錄:
# workspace:工作區目錄,在 Eclipse 建立的專案 (proj1, proj2, ...) 都置於此
# virtualenv:虛擬環境 (Virtual environment) 目錄, 包含各個專案的虛擬環境目錄 (proj1Venv, proj2Venv, ...)
# git:版本控制儲存庫 (Git Repository) 目錄,當專案進入版本控制後, Eclipse 會在此目錄下以專案名稱先建立一個目錄,然後將原先在 workspace/ 目錄下的專案移至該目錄裡,而且再建立一個 .git/ 版本控制目錄 (內含 Git 的相關設定), 讓專案目錄和專案的版本控制目錄分隔
* 例如:假設原先的專案目錄是 webapps/workspace/proj,版本控制後的專案目錄則移至 webapps/git/proj/proj/,該專案的版本控制目錄則為 webapps/git/proj/.git/
版本控制目錄的位置

Eclipse 強烈建議不要將版本控制目錄放在專案目錄底下, 以保持專案與版本控制資料之間的區隔。本教材採用此建議,因此另外建立 git/ 儲存庫目錄。 但也有許多開發者將版本控制目錄直接放在專案目錄裡 (例如: workspace/proj/.git/),如此就不需要儲存庫目錄了

▸ 依照上述規劃方式,因為本教材將開發名為 blog 之部落格專案, 因此實際目錄架構如下:

webapps/
   git/
      blog/        # 進入版本控制後才會產生
         .git/     # 專案的版本控制目錄
         blog/     # 進入版本控制後的專案目錄
   virtualenv/
      blogVenv/    # 專案的虛擬環境目錄
   workspace/
      blog/        # 初始的專案目錄,進入版本控制後移至 git 目錄

▸ 接下來就準備開始「把手弄髒」(Get your hands dirty!),揮汗實做吧!實做的方式分成兩種:

✶ 指令行的操作:在終端機 (Terminal) 輸入指令,例如建立 git 目錄: mkdir git
✶ Eclipse 的操作:以步驟方式呈現,例如:Right click project (滑鼠右鍵點專案) Team Commit ...
有關 Linux 指令

∗ 建立專案目錄架構

▸ 依照上述的規劃,建立專案目錄結構:

✶ Ubuntu (在終端機):
$ cd
$ mkdir webapps webapps/git webapps/virtualenv webapps/workspace
✶ Windows (在命令提示字元):
$ cd C:\Users\<username>
$ mkdir webapps webapps\git webapps\virtualenv webapps\workspace
✶ Mac (在終端機):
$ cd
$ mkdir webapps webapps/git webapps/virtualenv webapps/workspace
以上指令:先移到家目錄,然後一次新增四個目錄 ( webapps 一定要放在第一個,然後才能建立子目錄)

∗ 安裝 Python 3 程式語言

▸ Ubuntu:預設已安裝 Python 3 (執行檔在 /usr/bin/python3),因此無需安裝

▸ Windows:至 Python 官網 下載 python-3.x.x-amd64.exe 並儲存檔案

✶ 進行安裝:勾選「Install launcher ...」與「Add Python 3.x to PATH」並點擊「Install Now」開始安裝
✶ 預設安裝路徑為 C:\Users\<username>\AppData\Local\Programs\Python\Pythonx-x\

▸ Mac:至 Python 官網 下載安裝檔 (python-3.x.x-macosxy.y.pkg),儲存檔案並安裝

以上 3.x.x 中的 x 為 Python 版本數字, macosxy.y 中的 y 為 Mac OS 版本數字

∗ 安裝 Postgres 資料庫系統

▸ Ubuntu:在 Terminal 輸入以下指令 (先更新並安裝所有套件,然後再安裝 Postgres):

$ sudo apt update
[sudo] password for <username>:
$ sudo apt -y upgrade
$ sudo apt install libpq-dev postgresql postgresql-contrib
安裝之後,Postgres daemon (常駐程式) 就會開始執行,而且在每次電腦開機就會自動執行,無需人工啟動

▸ Windows:至 Postgres 官網 下載 Windows x86-64 版本 (檔名為:postgresql-x.x-x-windows-x64.exe),儲存檔案後安裝

✶ 設定:超級管理者 (Superuser),預設名稱:postgres, 密碼:postgres,埠號 (Port):5432 (預設),資料庫使用者群,Locale:Default locale
✶ 不需安裝 Stack Builder

▸ Mac:

✶ 先安裝 Homebrew:
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
✶ 利用 Homebrew 安裝 postgresql 並啟動資料庫系統:
$ brew update
$ brew install postgresql
$ brew services start postgresql
註:Linux 的 sudo 指令
  1. 第一次執行 sudo 指令時系統會詢問使用者密碼,之後就不會再詢問 (除非重新啟動 Terminal),我們假設讀者都有執行 sudo 的權限
  2. Linux 的 Terminal 環境中,許多套件在要求使用者輸入密碼時是不會顯示任何訊息的 (例如:不會顯示常見的星號 ****), 因此請不要誤以為沒有反應,儘管輸入您的密碼,然後再按 Enter 即可
  3. -y 指的是 yes,亦即安裝過程中所有問題都回答「是」,以便一次執行完畢,不再詢問決定

∗ 安裝 virtualenv 虛擬環境產生程式

▸ 虛擬環境 (Virtual environment) 概念:

✶ 由於不同專案會使用不同的套件,也可能會使用不同版本的相同套件,因此不能將所有套件都安裝在作業系統裡, 否則作業系統不僅套件繁多而雜亂、效能降低,甚至套件之間還會彼此衝突,同一套件也有可能不允許安裝多個版本
解決方案:各專案應該將所需的套件安裝在自己專屬的環境中 (稱為「虛擬環境」),如此執行環境就可以彼此隔絕,不會相互干擾
✶ 虛擬環境是一個專案 專屬 的執行環境及函式庫,用來與其他專案的環境隔絕
✶ 虛擬環境指定專案所需要的套件及其版本,讓開發環境、測試環境、和生產環境都能一致, 以免發生開發環境執行沒問題,到其他環境執行就出錯 (是否常聽到:在我的電腦 run 就 OK,到你的電腦 run 就當掉!? ;-)

▸ 安裝 virtualenv:

✶ Ubuntu:先安裝 python3-pip 程式,然後利用 pip3 指令來安裝 virtualenv 程式
$ sudo apt install python3-pip
$ sudo pip3 install virtualenv
# 註:pip3 (Pip Install Package) 是 Python 的套件管理程式, 名稱使用「遞迴首字縮寫」(Recursive acronym) 模式
✶ Windows:Python 套件裡已有 pip3.exe,可直接用來安裝 virtualenv 程式
C:\...> pip3 install virtualenv
✶ Mac:Python 套件裡亦有 pip3 程式,可直接用來安裝 virtualenv 程式
$ pip3 install virtualenv

∗ 安裝 Eclipse 整合式開發環境

▸ Ubuntu:

✶ 安裝 Open JDK (因為 Eclipse 是以 Java 開發的 ;-)
$ sudo add-apt-repository ppa:openjdk-r/ppa
$ sudo apt update
$ sudo apt install openjdk-11-jdk
# 以上第 1 個指令是加入套件庫,以後有新版時 Ubuntu 會自動更新
# 檢查 Java 的版本:$ java -version (第一行會出現 openjdk version "...",即可確認版本)
✶ 從「Ubuntu 軟體 Ubuntu software」 安裝 Eclipse Ubuntu搜尋

▸ Windows:

✶ 安裝 Java JDK:至 Oracle 官網 下載 Windows x64 檔案 (檔名:jdk-8u???-windows-x64.exe??? 是版本數字) 並安裝
✶ 從 Elipse 官網 下載 Eclipse IDE for Eclipse Committers (檔名為 eclipse-committers-<year>-<month>-x-win32-x86_64.zip, 其中 yearmonth 是版本年月), 解壓縮到目的目錄 (例如:C:\Users\<username>),Eclipse 是所謂的「綠色軟體」檔案, 不需要安裝即可直接執行

▸ Mac:

✶ 安裝 Java JDK:至 Oracle 官網 下載 Mac OS X x64 檔案 (檔名:jdk-8u???-macosx-x64.dmg) 並安裝
✶ 從 Elipse 官網 下載 Eclipse IDE for Eclipse Committers (檔名為 eclipse-committers-<year>-<month>-macosx-cocoa-x86_64.zip), 解壓縮到目的目錄

▸ 執行 Eclipse:

✶ Ubuntu:點擊左上角「概覽」並搜尋 eclipse,再點擊圖示即可啟動 (此時可右鍵點左側啟動欄的 Eclipse 圖示 加入喜好,該圖示就會鎖定在啟動欄,方便以後執行)
✶ Windows:點擊 C:\Users\<username>\eclipse\eclipse.exe 即可啟動, (此時可右鍵點下方工作列的 Eclipse 圖示 釘選到工作列,該圖示就會鎖定在工作列,方便以後執行)
✶ Macs:至應用程式點擊 eclipse 即可啟動, (此時可右鍵點下方工作列的 Eclipse 圖示 選擇「保留在 Dock 上」,該圖示就會鎖定在工作列,方便以後執行)

▸ 第一次執行 Eclipse 時,Eclipse 會詢問 "Select a directory as workspace",可輸入 Eclipse 工作區目錄:

✶ Ubuntu: /home/<username>/webapps/workspace
✶ Windows: C:\Users\<username>\webapps\workspace
✶ Mac: /Users/<username>/webapps/workspace
並且可將此目錄設為預設,下次啟動 Eclipse 時就會自動進入此目錄

▸ Eclipse 一開始會顯示歡迎畫面,可於右下角取消勾選 「Always show Welcome at start up」, 下次執行就不會出現此畫面

▸ Eclipse 會在使用者家目錄及 Eclipse 工作區目錄分別建立 .eclipse.metadata 目錄,這兩個目錄都是隱藏目錄, 前者儲存 Eclipse 的設定,後者儲存工作區及專案的相關設定

✶ 如果原先安裝有舊版的 Eclipse,建議將原先工作區的 .metadata 目錄刪除,以免新舊版本之設定相互衝突

▸ 安裝 PyDev 插件:PyDev 是在 Eclipse 的 Python 插件, 以支援 Python 程式語言

✶ Help Install New Software Add Name: PyDev, Location: http://pydev.org/updates (圖 A) Add 勾選 PyDev (圖 B) Next Next 點選 I accept the terms of the license agreements 同意安裝未簽署內容 (圖 C Install anyway)) Finish 重新啟動 Eclipse
PyDev 圖 A
PyDev2 圖 B
unsign 圖 C

▸ 安裝 TM Terminal 與 Web developer Tools:

✶ Help Install New Software Work with: http://download.eclipse.org/releases/latest Enter
✶ 展開 General Purpose Tools 勾選 TM Terminal
✶ 展開 Web, XML, Java EE and OSGi Enterprise Development 勾選 Eclipse Web Developer Tools
Next Next Accept terms Finish 重新啟動 Eclipse

▸ 變更 IDE 視版 (Perspective)

✶ 設定為 PyDev Perspective:點擊 Eclipse 右上角 Open Perspective 圖示 視圖 選擇 PyDev Open (會出現 pyDev視圖 圖示)
✶ 刪除 Java Perspective:右鍵點擊 Eclipse 右上角 Java Perspective 圖示 Java視圖 Close

:以下進行設定的所點選的 Preference 選項在 Ubuntu 與 Windows 環境中是在 Window 項目底下,在 Mac 環境中則在 Eclipse 項目底下

▸ 設定編輯器字體:

    Preferences General Editors Text Editors (右欄上方) Color and Fonts Edit Fonts:
- Ubuntu: DejaVu Sans Mono Book
- Windows: Consolas
- Mac: Consolas
   Size: 10 Apply

▸ 設定工作區文字編碼:

   Preferences General Workspace (右欄下方) Text file encoding:選 Default 或 Other 並設定為 UTF-8 Apply

▸ 設定縮排

✶ 一般文件:2 空格
  Preferences General Editors Text Editors (右欄) Displayed tab width: 2,勾選 Insert spaces for tabs Apply and Close
✶ JavaScript:2 空格
 Preferences JavaScript Code Style Formatter (右欄) New Profile name: myProfile OK Tab policy: Spaces only, Indentation size: 2, Tab size: 2 OK Active profile: myProfile Apply and Close
✶ Python:4 空格 (預設)
  Preferences PyDev Editor Tabs (右欄) Tab length: 4, 勾選 Replace tabs with spaces when typing Apply and Close
✶ CSS 與 HTML:2 空格
Preferences Web
- CSS Files Editor (右欄) 勾選 Indent using spaces, Indentation size: 2 Apply and Close
- HTML Files Editor (右欄) 勾選 Indent using spaces, Indentation size: 2 Apply and Close

▸ 依個人偏好可設定暗色主題 (Dark theme)

Preferences General Appearance (右欄) Theme: Dark Apply and Close
✶ 暗色主題的「Python重複出現字」預設的黃色太刺眼,改變顏色:
Preferences General Editors Text Editors Annotations (右欄) Occurrences (PyDev) (可能需要將視窗拉寬) Color: 選深藍色 Apply and Close
有關 Eclipse
  1. Eclipse 的缺點:啟動速度較慢,請耐心等候 ;-)
  2. 問答集:
    • 問:Eclipse 是開發 Python 專案最好的 IDE 嗎?
    • 答:當然不是,PyCharm 就比較厲害!
    • 問:那為什麼選擇 Eclipse?
    • 答:Open source, period ;-)

∗ 加速 Eclipse

▸ 取消自動通知

Preferences General Notifications (右欄) 取消勾選 Enable notifications Apply and Close

▸ 啟動時不要自動啟用插件

Preferences General Startup and Shutdown (右欄) 取消勾選所有項目 Apply and Close

▸ 停用拼字檢查

Preferences General Editors Text Editors Spelling (右欄) 取消勾選 Enable spell checking Apply and Close

▸ 暫停所有驗證器

Preferences Validation (右欄) 勾選 Suspend all validators Apply and Close ... Do the full rebuild now? Yes
Eclipse 編輯快速鍵

▸ 檔案

ctrl-s:存檔
ctrl-shift-s:儲存所有檔案
F5:刷新內容

▸ 縮排與註解

Tab:向右縮排
Shift-Tab:向左縮排
ctrl-/:註解 (或取消註解)
ctrl-shift-f:整份文件自動排版

▸ 文字選取

shift-Right:向右移動一格選取
shift-Left:向左移動一格選取
ctrl-shift-Right:向右移動一字選取
ctrl-shift-Left:向左移動一字選取
ctrl-a:全選

▸ 文字編輯

ctrl-c:複製
ctrl-x:剪下
ctrl-v:貼上
ctrl-z:上一步
ctrl-shift-z:下一步
ctrl-d:刪除目前行

▸ 尋找與取代

ctrl-f:尋找
ctrl-k:尋找下一個
ctrl-h:綜合尋找

▸ 程式撰寫

ctrl-1:快速協助 (例如加入 import)
ctrl-e:列出所有開啟檔案
ctrl-滑鼠點物件:跳至定義
ctrl-.:跳至下一個錯誤點
ctrl-l:跳至行數
ctrl-shift-g:列出所有呼叫程式
ctrl-shift-o:整理及自動匯入
ctrl-shift-p:跳至對應括號
在 Ubuntu 自行下載並安裝 Eclipse
(1) 從 Elipse 官網 下載 Eclipse IDE for Eclipse Committers (檔名為 eclipse-committers-<year>-<month>-linux-gtk-x86_64.tar.gz)
(2) 將 eclipse 安裝在 /opt 目錄:將下載的檔案移到 /opt 目錄 (如果有舊的 /opt/eclipse 目錄則將其刪除),然後解壓縮:
$ cd <...>       # 前往下載檔案所在目錄 (依據瀏覽器的設定,預設目錄是「下載」,有些人喜歡改為「桌面」)
$ sudo mv eclipse*gz /opt      # For clean installation
$ cd /opt
$ sudo rm -rf eclipse
$ sudo tar -zxvf eclipse*gz
註:Eclipse 的執行檔的路徑即為 /opt/eclipse/eclipse
(3) 新增 eclipse.desktop 檔案以建立 Eclipse 應用程式圖示 Eclipse圖示
$ sudo gedit /usr/share/applications/eclipse.desktop
內容如下,輸入完畢後儲存檔案:
[Desktop Entry]
Name=Eclipse
Type=Application
Exec=/opt/eclipse/eclipse
Terminal=false
Icon=/opt/eclipse/icon.xpm
Comment=Integrated Development Environment
NoDisplay=false
Categories=Development;IDE;
Name[en]=Eclipse
(4) 安裝 Eclipse 圖示
$ sudo desktop-file-install /usr/share/applications/eclipse.desktop
(5) 在 /usr/local/bin 目錄裡建立程式捷徑
$ sudo ln -s /opt/eclipse/eclipse /usr/local/bin/
慶祝達成目標!

恭喜您完成了系統安裝與環境設定程序:

  1. 以上的工作並不簡單,尤其對於新手而言,一定會到處卡關,能順利完成很不容易
  2. 系統設定的過程中需要非常細心,也需要相當大的耐心,如果您完成了,那要大大地慶祝,如果您卡關了, 請耐心檢查何處有錯或遺漏
  3. 這樣的繁瑣過程是成為一個優質的「開發者」(Developer) 所必須經過的訓練,越接近系統核心,所面對的問題就越精細、越複雜, 絲毫馬虎不得,但這也是提昇功力的不二法門
  4. 練習 1:重新執行所有設定開發環境的步驟,例如:將 ~/.eclipse/home/<username>/webapps/workspace/.metadata 兩個目錄刪除, 再重新設定 Eclipse 環境
  5. 練習 2:一段時間以後,不參考教材,僅憑記憶來執行本章裡的所有步驟
  6. 接下來就要進入 Django 的夢幻領域了,休息一下、喝杯咖啡 (千萬不要抽支菸! ;-),我們繼續奮鬥!

▸ 練習