如何在Debian8上将Postgresql与您的Django应用程序一起使用

来自菜鸟教程
跳转至:导航、​搜索

介绍

Django 是一个用于快速创建 Python 应用程序的灵活框架。 默认情况下,Django 应用程序配置为将数据存储到轻量级 SQLite 数据库文件中。 虽然这在某些负载下运行良好,但更传统的 DBMS 可以提高生产性能。

在本指南中,我们将演示如何安装和配置 PostgreSQL 以与您的 Django 应用程序一起使用。 我们将安装必要的软件,为我们的应用程序创建数据库凭据,然后启动并配置一个新的 Django 项目以使用此后端。

先决条件

要开始,您需要一个干净的 Debian 8 服务器实例,并设置非 root 用户。 非 root 用户必须配置有 sudo 权限。 按照我们的 初始服务器设置指南 了解如何设置。

当您准备好继续时,以您的 sudo 用户身份登录并继续阅读。

从 Debian 存储库安装组件

我们的第一步是从存储库中安装我们需要的所有部分。 我们将安装 Python 包管理器 pip,以便安装和管理我们的 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$

一旦您的虚拟环境处于活动状态,您就可以使用 pip 安装 Django。 我们还将安装 psycopg2 包,它允许我们使用我们配置的数据库:

笔记

无论你使用的是哪个版本的 Python,在激活虚拟环境时,都应该使用 pip 命令(而不是 pip3)。


pip install django psycopg2

我们现在可以在我们的 myproject 目录中启动一个 Django 项目。 这将创建一个同名的子目录来保存代码本身,并将在当前目录中创建一个管理脚本:

注意: 确保在命令末尾添加点,以便正确设置。 由于我们已经创建了一个父项目目录来保存我们的虚拟环境目录,所以我们不希望如果我们离开点将创建额外的目录级别。


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 实例的地址或域名的白名单。 任何带有不在此列表中的 Host 标头的传入请求都将引发异常。 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

在您的网络浏览器中,访问您的服务器的域名或 IP 地址,后跟 :8000 以访问默认的 Django 根页面:

http://server_domain_or_IP:8000

您应该会看到默认的索引页面:

/admin 附加到 URL 的末尾,您应该能够访问管理界面的登录屏幕:

输入您刚刚使用 createsuperuser 命令创建的用户名和密码。 然后您将被带到管理界面:

完成调查后,您可以通过在终端窗口中按 CTRL-C 来停止开发服务器。

通过访问管理界面,我们已经确认我们的数据库已经存储了我们的用户帐户信息并且可以适当地访问它。

我们可以通过使用 psql 客户端查询 Postgres 数据库本身来进一步验证这一点。 例如,我们可以使用我们项目的用户 (myprojectuser) 连接到我们的项目数据库 (myproject) 并通过键入以下内容打印出所有可用的表:

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 在我们的数据库中创建了一些表,以确认我们的设置是有效的。

结论

在本指南中,我们演示了如何安装和配置 PostgreSQL 作为 Django 项目的后端数据库。 虽然 SQLite 可以轻松处理开发和轻型生产使用期间的负载,但大多数项目都受益于实现功能更全的 DBMS。