介绍
Django 是一个灵活的框架,可以快速创建 Python 应用程序. 默认情况下,Django 应用程序被配置为将数据存储在轻量级的 SQLite 数据库文件中。
在本指南中,我们将展示如何安装和配置PostgreSQL以与您的Django应用程序一起使用,我们将安装必要的软件,为我们的应用程序创建数据库凭据,然后启动并配置一个新的Django项目以使用这个后端。
前提条件
要开始,你需要一个清洁的 Debian 8 服务器实例,并安装了非根用户。非根用户必须配置有sudo
特权。
当你准备好继续时,作为你的sudo
用户登录并继续阅读。
安装来自 Debian 存储库的组件
我们的第一步将是从库中安装我们需要的所有部件,我们将安装Python包管理器pip
,以便安装和管理我们的Python组件,我们还将安装数据库软件和相关库,以便与它们进行交互。
Python 2 和 Python 3 需要略有不同的包,所以选择下面的命令来匹配您的项目的 Python 版本。
如果您正在使用 Python 2,请键入:
1sudo apt-get update
2sudo apt-get install python-pip python-dev libpq-dev postgresql postgresql-contrib
如果您正在使用 Python 3,请键入:
1sudo apt-get update
2sudo apt-get install python3-pip python3-dev libpq-dev postgresql postgresql-contrib
安装完成后,我们可以继续创建我们的数据库和数据库用户。
创建数据库和数据库用户
默认情况下,Postgres 使用一个名为对等身份验证
的身份验证方案进行本地连接,这基本上意味着如果用户的操作系统用户名匹配一个有效的Postgres 用户名,则该用户可以无需进一步身份验证登录。
在 Postgres 安装过程中,一个名为 postgres
的操作系统用户被创建,以匹配 postgres
的 PostgreSQL 管理用户. 我们需要使用这个用户来执行管理任务. 我们可以使用 sudo
并通过-u
选项输入用户名。
通过键入登录到一个互动的 Postgres 会话:
1sudo -u postgres psql
首先,我们将为我们的Django项目创建一个数据库. 每一个项目都应该有自己的孤立数据库,出于安全原因. 在本指南中,我们将我们的数据库称为myproject
,但对于真实项目,最好选择一些更为描述性的内容:
<$>[注] 注: 请记住在 SQL 提示中用半字符结束所有命令。
1CREATE DATABASE myproject;
1[secondary_label Output]
2CREAT DATABASE
接下来,我们将创建一个数据库用户,我们将使用它来连接和与数据库互动。
1CREATE USER myprojectuser WITH PASSWORD 'password';
1[secondary_label Output]
2CREATE ROLE
接下来,我们将更改我们刚刚创建的用户的一些连接参数,这将加快数据库操作,因为每次建立连接时不需要查询和设置正确的值。
我们正在将默认编码设置为 UTF-8,这就是 Django 所期望的格式。我们还将默认的交易隔离方案设置为阅读承诺
,即从未承诺的交易中读取块。最后,我们正在设置时区。
1ALTER ROLE myprojectuser SET client_encoding TO 'utf8';
2ALTER ROLE myprojectuser SET default_transaction_isolation TO 'read committed';
3ALTER ROLE myprojectuser SET timezone TO 'UTC';
1[secondary_label Output]
2ALTER ROLE
3ALTER ROLE
4ALTER ROLE
现在,我们需要做的就是给我们的数据库用户访问我们创建的数据库的权利:
1GRANT ALL PRIVILEGES ON DATABASE myproject TO myprojectuser;
1[secondary_label Output]
2GRANT
完成后退出 SQL 提示。
1\q
你现在应该被带回你的以前的壳会话。
在虚拟环境中安装 Django
现在我们的数据库已经设置,我们可以安装Django。为了更好的灵活性,我们将在Python虚拟环境中安装Django及其所有依赖。
如果您正在使用 Python 2,您可以通过键入正确的软件包来安装:
1sudo pip install virtualenv
如果您正在使用 Python 3,您可以通过键入正确的软件包来安装:
1sudo pip3 install virtualenv
创建并移动到一个目录,以保持您的Django项目:
1mkdir ~/myproject
2cd ~/myproject
我们可以创建一个虚拟环境来存储我们的Django项目的Python要求,通过键入:
1virtualenv venv
这将安装Python的本地副本和本地pip
命令到项目目录中的名为venv
的目录中。
在我们在虚拟环境中安装应用程序之前,我们需要激活它,您可以通过键入:
1source venv/bin/activate
您的提示将更改,以表示您现在在虚拟环境中运作,它将看起来像(venv)user@host:~/myproject$
。
一旦你的虚拟环境是活跃的,你可以安装Django用pip
。我们还将安装psycopg2
包,这将使我们能够使用我们配置的数据库:
<$>[注]
[标签注]
无论您正在使用哪个版本的 Python,当虚拟环境被激活时,您应该使用pip
命令(而不是pip3
)。
1pip install django psycopg2
我们现在可以在我们的myproject
目录中启动一个Django项目,这将创建一个同名子目录以保留代码本身,并在当前目录中创建一个管理脚本:
<$>[注] 注: 请确保在命令的末尾添加点,以便此设置正确。由于我们已经创建了一个主项目目录来保留我们的虚拟环境目录,我们不希望如果我们离开点,将创建的额外目录级别。
1django-admin.py startproject myproject .
您的当前目录结构应该是这样的:
1.
2└── ./myproject/
3 ├── manage.py
4 ├── myproject/
5 │ ├── __init__.py
6 │ ├── settings.py
7 │ ├── urls.py
8 │ └── wsgi.py
9 └── venv/
10 └── . . .
正如你所看到的,我们有一个主项目目录,其中包含一个manage.py
脚本,一个内部项目目录和我们之前创建的venv
虚拟环境目录。
设置 Django 数据库设置
现在我们有一个项目,我们需要将其配置为使用我们创建的数据库。
打开位于儿童项目目录中的主要 Django 项目设置文件:
1nano ~/myproject/myproject/settings.py
在我们设置数据库之前,您可能还需要调整ALLOWED_HOSTS
指令。这定义了可以用于连接到 Django 实例的地址或域名的白列表。任何未列入此列表的 Host 标题的输入请求都会引发一个例外。
在方块中,列出与您的 Django 服务器相关的 IP 地址或域名。每个项目都应该列出 在报价中 与条目分开的条目 **。如果您想响应域和任何子域的请求,请预先预定一个期限,直到条目开始。
1[label ~/myproject/myproject/settings.py]
2. . .
3# The simplest case: just add the domain name(s) and IP addresses of your Django server
4# ALLOWED_HOSTS = [ 'example.com', '203.0.113.5']
5# To respond to 'example.com' and any subdomains, start the domain with a dot
6# ALLOWED_HOSTS = ['.example.com', '203.0.113.5']
7ALLOWED_HOSTS = ['your_server_domain_or_IP', 'second_domain_or_IP', . . .]
接下来,找到看起来像这样的数据库
部分:
1[label ~/myproject/myproject/settings.py]
2. . .
3
4DATABASES = {
5 'default': {
6 'ENGINE': 'django.db.backends.sqlite3',
7 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
8 }
9}
10
11. . .
目前已配置使用 SQLite 作为数据库,我们需要更改,以便使用我们的 PostgreSQL 数据库。
首先,更改引擎,以便它使用postgresql_psycopg2
适配器而不是sqlite3
适配器。对于NAME
,使用您的数据库的名称(在我们的示例中myproject
)我们还需要添加登录凭证。我们需要用户名、密码和主机来连接。我们将添加并放空端口选项,以便选择默认:
1[label ~/myproject/myproject/settings.py]
2. . .
3
4DATABASES = {
5 'default': {
6 'ENGINE': 'django.db.backends.postgresql_psycopg2',
7 'NAME': 'myproject',
8 'USER': 'myprojectuser',
9 'PASSWORD': 'password',
10 'HOST': 'localhost',
11 'PORT': '',
12 }
13}
14
15. . .
完成后,保存并关闭文件。
迁移数据库并测试您的项目
现在 Django 设置已配置,我们可以将数据结构迁移到我们的数据库并测试服务器。
我们可以从创建和应用迁移到我们的数据库开始,因为我们还没有任何实际数据,这将简单地设置最初的数据库结构:
1cd ~/myproject
2./manage.py makemigrations
3./manage.py migrate
创建数据库结构后,我们可以通过键入创建一个管理帐户:
1./manage.py createsuperuser
您将被要求选择用户名,提供电子邮件地址,并选择并确认帐户的密码。
<$>[注] 注: 在尝试开发服务器之前,请确保在防火墙中打开端口。
如果你正在运行一个ufw
防火墙,你可以通过键入打开相应的端口:
1sudo ufw allow 8000
如果您正在运行iptables
防火墙,您需要的确切命令取决于当前的防火墙配置。
1sudo iptables -I INPUT -p tcp --dport 8000 -j ACCEPT
美元
接下来,您可以通过启动 Django 开发服务器来测试您的数据库是否正常运行:
1./manage.py runserver 0.0.0.0:8000
在您的 Web 浏览器中,访问您的服务器的域名或 IP 地址,然后是 :8000
来访问默认的 Django 根页面:
1http://server_domain_or_IP:8000
您应该看到默认索引页面:
添加/admin
到URL的尽头,你应该能够访问登录屏幕到管理员界面:
输入你刚刚使用createsuperuser
命令创建的用户名和密码,然后你将被带到管理员界面:
完成调查后,您可以通过在终端窗口中按 CTRL-C 来阻止开发服务器。
通过访问管理员界面,我们确认我们的数据库存储了我们的用户帐户信息,并且可以适当访问。
例如,我们可以连接到我们的项目数据库(‘myproject’)与我们的项目用户(‘myprojectuser’)并打印所有可用的表,键入:
1psql -W myproject myprojectuser -h 127.0.0.1 -f <(echo '\dt')
「-W」旗使「psql」提示您尋找適當的密碼.我們必須明確地使用「-h」旗,在網路上連接到 localhost,以表明我們希望使用密碼驗證而不是同行驗證。
1[secondary_label Output]
2 List of relations
3 Schema | Name | Type | Owner
4--------+----------------------------+-------+---------------
5 public | auth_group | table | myprojectuser
6 public | auth_group_permissions | table | myprojectuser
7 public | auth_permission | table | myprojectuser
8 public | auth_user | table | myprojectuser
9 public | auth_user_groups | table | myprojectuser
10 public | auth_user_user_permissions | table | myprojectuser
11 public | django_admin_log | table | myprojectuser
12 public | django_content_type | table | myprojectuser
13 public | django_migrations | table | myprojectuser
14 public | django_session | table | myprojectuser
15(10 rows)
正如您所看到的,Django 在我们的数据库中创建了一些表,证实我们的设置是有效的。
结论
在本指南中,我们展示了如何安装和配置 PostgreSQL 作为 Django 项目的后端数据库.虽然 SQLite 可以在开发和轻量生产使用期间轻松处理负载,但大多数项目都受益于实施更具功能的 DBMS。