在服务器端开始一个 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 的学习来说意义不大,可以当做另外一个主题去研究了。