在服務器端開始一個 Django 工程,采用 PostgreSQL 數據庫。
這裡安裝最新的 Django
$sudo pip3 install django
如果是在原有基礎上升級安裝 Django,則輸入以下命令
$sudo pip3 install django --upgrade
pip 會將舊版本的 Django 卸載後安裝最新版。
注意,這裡使用的命令是 sudo pip3
而不是簡單地使用 pip
,是因為沒有在 virtualenv 環境下安裝,所有操作都是在操作系統實環境下完成的,而 Ubuntu 缺省的 Python 環境是 Python 2,很多系統基礎軟件都是基於這個版本的 Python 開發,強行改為缺省使用 Python 3 會遇到各種蛋疼的情況(不要問我為什麼知道)。之所以采用這種方式,是因為這裡只是我個人用來練習的項目,沒有生產意義,偷懶沒有嚴格做隔離控制。在生產 上做開發部署,經常會有多版本並行使用的需求,需要根據實際情況配置開發和生產環境,這裡不做詳細討論。
這裡先創建一個名為 teamtea 的項目
$cd workspace/django $django-admin starproject teamtea
沒錯,現在可以直接使用 Django 的工程管理命令 django-admin
了。
這裡將工程創建好之後先放在一邊,稍後進行配置。
Ubuntu 官方源的 PostgreSQL 總是會慢一個小版本,版本控表示不愉快,於是按照官方網站上的說明安裝了最新版。
首先將 PostgreSQL 官方源添加到 apt 源列表。在 /etc/apt/source.list.d/
目錄下創建 pgdg.list
文件,文件內容為
deb http://apt.postgresql.org/pub/repos/apt/ trusty-pgdg main
這裡是針對 Ubuntu 14.04 的源,其他版本的系統可以在文檔中找到相關的源。
然後導入源的簽名。
$wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
至此就將 PostgreSQL 的官方源添加到源列表中了。接下來更新包列表,安裝需要用到的 postgresql-9.4
和 postgresql-server-dev-9.4
兩個包。
$sudo apt-get update $sudo apt-get install postgresql-9.4 postgresql-server-dev-9.4
至此完成了 PostgreSQL 9.4 的基本安裝。
同樣需要注意的是,這裡的數據庫版本選擇純粹因為個人喜好,實際開發和生產過程中應按需選擇版本。
安裝完 PostgreSQL 之後會自動在系統中創建名為 postgres 的用戶,即是 PostgreSQL administrator 用戶,對 PostgreSQL 的操作最好都由這個用戶來進行,盡量避免使用 root 用戶。為了使用這個用戶,首先需要修改它的密碼。
$sudo passwd postgres
postgres用戶密碼和訪問
以上是操作系統中的 postgres 用戶的操作,而我們知道數據庫管理系統也有用戶的概念,PostgreSQL 的管理員用戶也是 postgres,為了能夠使用它管理數據庫,同樣需要設置密碼。首先登錄到 postgres 用戶下,
$su postgres
然後進入 PostgreSQL 的管理程序 psql
,此時是不需要密碼的,因為訪問控制項缺省為 peer
即只允許本地操作系統上的 postgres 用戶訪問。
$psql
此時命令提示符變為 postgres=#
,說明進入了 psql
環境,設置密碼,
postgres=# \password
然後退出 psql
環境,
postgres=# \q
之後修改 postgres 用戶的訪問控制項,編輯 /etc/postgresql/9.4/main/pg_hba.conf 文件,將
local all postgres peer
修改為
local all postgres md5
重新載入配置文件使修改生效,
$pg_ctlcluster 9.4 main reload
注意 Debian 系的 Linux 采用的是 pg_ctlcluster
命令,而非 pg_ctl
命令。
此時再次嘗試使用 psql
就需要輸入密碼了。
為了能使客戶機上的 Navicat 登錄管理 PostgreSQL,需要開啟對網絡端口的監聽,編輯 /etc/postgresql/9.4/main/postgresql.conf 文件,將
#listen_addresses = 'localhost'
修改為
listen_addresses = '*'
注意,這裡去掉了行首的注釋。同樣,重新載入配置文件使修改生效。
現在可以通過 Navicat 連接管理 PostgreSQL 數據庫了,在圖形化界面下很容易創建用戶和數據庫,這裡創建與應用同名的用戶和數據庫就好了,全部命名為 teamtea
。
同樣需要添加訪問權限,編輯 /etc/postgresql/9.4/main/pg_hba.conf 文件,添加一行
local teamtea teamtea md5
這裡限制了用戶 teamtea 只能訪問名為 teamtea 的數據庫,這對應用來說是足夠的,對整個數據庫系統來說也是安全的。
完成上述工作後,就可以退出 postgres 用戶了。
Django 連接 PostgreSQL 依賴於 psycopg2 驅動,在初始化項目之前必須先安裝這個包,
$sudo pip3 install psycopg2
這中間涉及到編譯過程,依賴於 gcc, make 以及上面安裝的 postgresql-server-dev-9.4 等包,如果安裝失敗則需要根據提示先裝好依賴。
現在可以開始配置我們的 Django 工程 teamtea 了,進入工程目錄,編輯文件 /teamtea/settings.py 文件,將數據庫配置項修改為
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'NAME': 'teamtea', 'USER': 'teamtea', 'PASSWORD': 'teamtea', 'HOST': 'localhost', 'PORT': '5432', } }
關於數據庫配置項可以參考官方文檔。
這裡同時將工程的時區設置為 UTC+8 即北京時間,將時區配置項修改為
TIME_ZONE = 'Asia/Shanghai'
現在可以對工程進行初始化了,需要說明的是,從 Django 1.7 開始已經將原有的數據庫同步命令 syncdb
標記為 deprecated 了,並將在 1.9 中完全刪除該命令,取代它的是 migrate
命令,
python3 manage.py migrate
這裡需要說明的是,因為 Django 是通過 pip3
安裝在 Python 3 的實環境下的,在執行 manage.py 腳本之前需要指定運行環境為 Python 3,否則會找不到 Django,使用 virtualenv 會有所改善。
現在可以啟動 Django 內置的簡單測試用 web 服務器來測試整個工程是否可以運轉起來了,
python3 manage.py runserver 0.0.0.0:8000
這裡需要指定 IP 和端口號,否則只能在本地訪問。
現在打開用戶機的浏覽器,訪問 http://IP:8000 就可以看到調試用的頁面了,說明程序運行正常。
終止服務只需要 Ctrl-C
終止進程就行了。
整個過程還是因為不熟悉走了不少彎路,尤其是在我的短板數據庫這一塊,對 PostgreSQL 還需要加強學習啊。
作為學習用的工程搭建過程,這邊文章描寫的步驟勉強是夠用的,但是還顯得很簡陋,還有很多工作可以做,例如使用 virtualenv 管理開發環境,避免直接在實環境下進行開發。還可以使用 git 來進行版本控制,這即使在學習階段也是很有必要的,它能幫助記下每次可以正常運行的代碼,防止某次改動後程序無法運行而又毫無頭緒的尴尬情形。
當然,部署 web 應用還可以使用 uwsgi + nginx 的方式,不過這更復雜,對 Django 的學習來說意義不大,可以當做另外一個主題去研究了。