介绍
Django是一个用于快速创建Python应用程序的灵活框架。默认情况下,Django应用程序配置为将数据存储到轻量级SQLite数据库文件中。虽然这在一些负载下运行良好,但更传统的DBMS可以提高生产性能。 在本指南中,我们将演示如何安装和配置PostgreSQL以与Django应用程序一起使用。我们将安装必要的软件,为我们的应用程序创建数据库凭据,然后启动并配置一个新的Django项目以使用此后端。先决条件
要开始,您需要一个非root用户设置的干净的Debian 8服务器实例。 非root用户必须配置sudo
特权。 了解如何按照我们设置此
服务器初始设置指南 。 当你准备好继续,请以你的
sudo
用户和阅读。
从Debian存储库安装组件
我们的第一步是安装我们需要的所有零件,从存储库。我们将安装pip
,Python的包管理器,以便安装和管理我们的Python组件。我们还将安装数据库软件和与之交互所需的相关库。 Python 2和Python 3需要稍微不同的软件包,因此请选择与项目的Python版本相匹配的下列命令。 如果您正在使用
Python 2,请键入:
sudo apt-get update
sudo apt-get install python-pip python-dev libpq-dev postgresql postgresql-contrib
如果您正在使用
Python 3,键入:
sudo apt-get update
sudo apt-get install python3-pip python3-dev libpq-dev postgresql postgresql-contrib
随着安装的失败,我们可以继续创建我们的数据库和数据库用户。
创建数据库和数据库用户
默认情况下,Postgres使用称为“对等身份验证”的身份验证方案进行本地连接。基本上,这意味着如果用户的操作系统用户名与有效的Postgres用户名匹配,则该用户可以在没有进一步身份验证的情况下登录。 期间Postgres的安装,操作系统用户名为postgres
创建以对应于
postgres
PostgreSQL的管理用户。 我们需要使用此用户来执行管理任务。 我们可以通过
sudo
,并在用户名与传递的
-u
选项。 键入以下内容登录到交互式Postgres会话:
sudo -u postgres psql
首先,我们将为我们的Django项目创建一个数据库。出于安全原因,每个项目都应该有自己的隔离数据库。我们将调用我们的数据库
myproject
本指南中,但它总是更好的选择更具描述性的真正的项目:
注意:请记住在用分号一个SQL提示结束所有命令。
CREATE DATABASE myproject;
OutputCREAT DATABASE
接下来,我们将创建一个数据库用户,我们将使用它来连接和与数据库交互。将密码设置为强有力且安全的:
CREATE USER myprojectuser WITH PASSWORD 'password';
OutputCREATE ROLE
接下来,我们将修改刚刚创建的用户的几个连接参数。这将加速数据库操作,因为每次建立连接时都不必查询和设置正确的值。 我们将默认编码设置为UTF-8,这是Django所期望的格式。我们还将默认事务隔离方案设置为“读提交”,这会阻止从未提交的事务读取。最后,我们设置时区。缺省情况下,我们的Django的项目将被设置为使用
UTC
。 这些是所有建议的
Django项目本身 。
ALTER ROLE myprojectuser SET client_encoding TO 'utf8';
ALTER ROLE myprojectuser SET default_transaction_isolation TO 'read committed';
ALTER ROLE myprojectuser SET timezone TO 'UTC';
OutputALTER ROLE
ALTER ROLE
ALTER ROLE
现在,我们需要做的是给我们的数据库用户访问我们创建的数据库的权限:
GRANT ALL PRIVILEGES ON DATABASE myproject TO myprojectuser;
OutputGRANT
完成后退出SQL提示。
\q
你现在应该回到你以前的shell会话。
在虚拟环境中安装Django
现在我们的数据库已经设置好了,我们可以安装Django了。为了更好的灵活性,我们将在Python虚拟环境中安装Django及其所有依赖项。该virtualenv
包允许您轻松地创建这些环境。 如果您正在使用
Python 2,您可以安装正确的包通过键入:
sudo pip install virtualenv
如果您正在使用
Python 3中 ,您可以安装正确的包通过键入:
sudo pip3 install virtualenv
创建并移动到一个目录来保存你的Django项目:
mkdir ~/myproject
cd ~/myproject
我们可以创建一个虚拟环境,通过键入以存储我们的Django项目的Python需求:
virtualenv venv
这将安装Python和本地的本地副本
pip
命令到一个名为目录
venv
项目目录之内。 在我们在虚拟环境中安装应用程序之前,我们需要激活它。您可以键入以下内容:
source venv/bin/activate
您的提示将更改为表示您现在在虚拟环境中操作。它看起来像这样
( venv ) user @ host :~/ myproject $
。 一旦你的虚拟环境是活动的,你可以安装Django
pip
。 我们也将安装
psycopg2
包,这将允许我们使用我们配置的数据库:
注意
无论哪个版本的Python您正在使用,当虚拟环境中被激活,你应该使用pip
命令(不pip3
)。
pip install django psycopg2
现在,我们可以开始我们的内Django项目
myproject
目录。这将创建一个具有相同名称的子目录来保存代码本身,并将在当前目录中创建一个管理脚本:
注意:确保在使这一设置正确命令的末尾添加点。因为我们已经创建了一个父项目目录来保存我们的虚拟环境目录,所以我们不想要创建额外的目录级别,如果我们离开点。
django-admin.py startproject myproject .
您当前的目录结构应如下所示:
.
└── ./myproject/
├── manage.py
├── myproject/
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
└── venv/
└── . . .
正如你所看到的,我们有一个持有父项目目录
manage.py
脚本,一个内部项目目录,并
venv
我们前面创建的虚拟环境目录。
配置Django数据库设置
现在我们有一个项目,我们需要配置它来使用我们创建的数据库。 打开位于子项目目录中的主Django项目设置文件:nano ~/myproject/myproject/settings.py
在我们准备建立数据库,您可能还需要调整
ALLOWED_HOSTS
指令。 这定义了可用于连接到Django实例的地址或域名的白名单。 任何传入的请求与
主机头不在此名单将引发异常。 Django要求您设置此项以防止某类安全漏洞。 在方括号中,列出与您的Django服务器相关联的IP地址或域名。每个项目
应与
用逗号分隔的条目
报价上市。如果您希望响应域和任何子域的请求,请在该条目的开头添加一个句点。在下面的代码段中,有几个注释掉的示例用于演示格式条目的正确方式:
〜/ myproject / myproject / settings.py
. . .
# The simplest case: just add the domain name(s) and IP addresses of your Django server
# ALLOWED_HOSTS = [ 'example.com', '203.0.113.5']
# To respond to 'example.com' and any subdomains, start the domain with a dot
# ALLOWED_HOSTS = ['.example.com', '203.0.113.5']
ALLOWED_HOSTS = ['your_server_domain_or_IP', 'second_domain_or_IP', . . .]
接下来,找到
DATABASES
部分看起来像这样:
〜/ myproject / myproject / settings.py
. . .
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
. . .
这当前配置为使用SQLite作为数据库。我们需要改变它,使用我们的PostgreSQL数据库。 首先,改变发动机,使其使用
postgresql_psycopg2
适配器,而不是
sqlite3
适配器。 对于
NAME
,使用你的数据库的名称(
myproject
在我们的例子)。我们还需要添加登录凭据。我们需要用户名,密码和主机来连接。我们将添加并留空白端口选项,以便选择默认值:
〜/ myproject / myproject / settings.py
. . .
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'myproject',
'USER': 'myprojectuser',
'PASSWORD': 'password',
'HOST': 'localhost',
'PORT': '',
}
}
. . .
完成后,保存并关闭文件。
迁移数据库并测试项目
现在Django设置已配置,我们可以将我们的数据结构迁移到我们的数据库并测试服务器。 我们可以从创建和应用迁移到我们的数据库开始。由于我们还没有任何实际数据,这将简单地设置初始数据库结构:cd ~/myproject
./manage.py makemigrations
./manage.py migrate
创建数据库结构后,我们可以通过键入以下内容创建管理帐户:
./manage.py createsuperuser
系统将要求您选择用户名,提供电子邮件地址,然后选择并确认帐户的密码。
注:在尝试开发服务器,确保在防火墙上打开的端口。 如果你碰巧运行
ufw
防火墙,您可以打开通过键入相应的端口:
sudo ufw allow 8000
如果你正在运行
iptables
防火墙,你需要确切的命令取决于您当前的防火墙配置。 对于
大多数配置 ,这个命令应该工作:
sudo iptables -I INPUT -p tcp --dport 8000 -j ACCEPT
接下来,您可以通过启动Django开发服务器来测试数据库是否正常执行:
./manage.py runserver 0.0.0.0:8000
在Web浏览器,访问你的服务器的域名或IP地址后面
:8000
达到默认的Django根页面:
http://server_domain_or_IP:8000
您应该看到默认索引页:
追加
/admin
到URL的末尾,你应该能够进入登录界面管理界面:
输入您刚刚使用创建的用户名和密码
createsuperuser
命令。然后,您将转到管理界面:
完成调查后,您可以通过在终端窗口中按CTRL-C来停止开发服务器。 通过访问管理界面,我们已经确认我们的数据库已经存储了我们的用户帐户信息,并且可以正确访问。 我们可以通过查询Postgres数据库本身进一步验证此
psql
客户端。 例如,我们可以连接到我们的项目数据库(
myproject
)与我们的项目的用户(
myprojectuser
),并通过键入打印出所有可用的表:
psql -W myproject myprojectuser -h 127.0.0.1 -f <(echo '\dt')
将
-W
标志使
psql
提示你输入相应的密码。 我们必须明确地使用
-h
标志连接到本地主机通过网络,以表明我们要使用密码验证,而不是对等身份验证。 我们使用
-f
标志在通过
psql
我们要执行元命令,
\dt
,其中列出了所有数据库中的表:
Output List of relations
Schema | Name | Type | Owner
--------+----------------------------+-------+---------------
public | auth_group | table | myprojectuser
public | auth_group_permissions | table | myprojectuser
public | auth_permission | table | myprojectuser
public | auth_user | table | myprojectuser
public | auth_user_groups | table | myprojectuser
public | auth_user_user_permissions | table | myprojectuser
public | django_admin_log | table | myprojectuser
public | django_content_type | table | myprojectuser
public | django_migrations | table | myprojectuser
public | django_session | table | myprojectuser
(10 rows)
如你所见,Django在我们的数据库中创建了一些表,这些表确认我们的设置是有效的。