2023完整指南:在Ubuntu 22.04上配置PostgreSQL与Django应用

引言

Django是一个快速创建Python应用程序的灵活框架。默认情况下,Django应用程序被配置为将数据存储到轻量级的SQLite数据库文件中。虽然在某些负载下这样做效果不错,但在生产环境中,使用更传统的数据库管理系统可以提高性能。

在本指南中,您将使用Django应用程序安装和配置PostgreSQL(通常称为Postgres)。您还将安装一些软件包,为应用程序创建数据库凭据,然后使用此后端启动并配置新的Django项目。

先决条件

首先,您需要一个已设置非root用户并配备sudo权限的Ubuntu 22.04服务器。按照我们的初步服务器设置指南来学习如何完成这一设置。

当您准备好继续时,请用您的超级用户身份登录。

步骤1 – 从Ubuntu仓库安装组件

首先,通过使用apt更新您的软件包管理器缓存。

$ sudo apt update

然后,为您的Django项目安装必要的组件。这包括pip,Python的包管理器,用于安装和管理Python组件。此外,还要安装Postgres以及其他库来辅助您的项目。

$ sudo apt install python3-pip python3-dev libpq-dev postgresql postgresql-contrib

在安装完Python、Postgres以及额外的库之后,您可以开始创建您的数据库。

步骤2 – 创建数据库和数据库用户

默认情况下,Postgres在本地连接中使用一种称为同行身份验证的认证方案。这意味着如果用户的操作系统用户名与有效的Postgres用户名匹配,该用户可以无需进一步身份验证即可登录。

在Postgres安装过程中,创建了一个操作系统用户postgres,对应于postgres PostgreSQL管理用户。您需要使用这个用户postgres执行管理任务。使用sudo命令传递用户名postgres和-u选项,以用户身份而不是root身份运行命令。通过编写以下内容登录交互式Postgres会话:

$ sudo -u postgres psql

现在可以访问 postgres 用户的 shell 会话。

下一步,为您的Django项目创建一个数据库。出于安全原因,每个项目都应该有自己独立的数据库。在本指南中,数据库被称为myproject,但最好习惯性地为其取一个更能描述的名字。此外,在输入Postgres命令时,请记得在SQL提示符处用分号(;)结束命令。

postgres=# CREATE DATABASE myproject;

现在创建一个与数据库连接并进行交互的数据库用户。将密码设置为一个强而安全的密码。

postgres=# CREATE USER myproject_user WITH PASSWORD 'myproject_database_password';

然后,修改您创建的用户的一些连接参数。这样可以加快数据库操作,避免每次建立连接时都要查询和设置正确的值。首先,将默认编码设置为UTF-8。

postgres=# ALTER ROLE myproject_user SET client_encoding TO 'utf8';

然后,将默认的事务隔离级别设置为读已提交,该级别会阻止未提交事务的读取。

postgres=# ALTER ROLE myproject_user SET default_transaction_isolation TO 'read committed';

最后,设置时区。默认情况下,您的Django项目使用UTC时区。这些是Django项目的建议。

postgres=# ALTER ROLE myproject_user SET timezone TO 'UTC';

现在,给您的数据库用户在您创建的数据库中授予访问权限。

postgres=# GRANT ALL PRIVILEGES ON DATABASE myproject TO myproject_user;

退出SQL提示符,返回到postgres用户的Shell会话。

postgres=# \q

现在数据库已设置好,您可以安装Django。

步骤3 – 在虚拟环境中安装Django

为了获得更好的灵活性,您将在Python虚拟环境中安装Django及其所有依赖项。

您可以通过安装virtualenv软件包来创建这些环境,请输入以下命令:

  1. sudo pip install virtualenv

 

接下来,创建一个目录来存放您的Django项目。

  1. mkdir ~/myproject

 

然后进入该目录。

  1. cd ~/myproject

 

现在,您可以使用以下方法创建一个虚拟环境来存储Django项目的Python需求。

  1. python3 -m virtualenv myprojectenv

 

这会在您的项目目录下创建一个名为myprojectenv的目录,并在其中安装本地的Python和pip副本。

在安装虚拟环境中的应用程序之前,您必须先激活它。您可以通过输入以下命令来激活:

  1. source myprojectenv/bin/activate

 

您会看到提示已经变成虚拟环境中操作。例如:(myprojectenv)user@host:~/myproject$

一旦您的虚拟环境被激活,您就可以使用pip安装Django。同时,您还需要安装psycopg2包,这样才能使用您预先配置好的数据库。

  1. pip install Django psycopg2

 

注意:无论您使用的是哪个版本的Python,在虚拟环境被激活时,您应该使用pip命令而不是pip3。现在您可以在myproject目录中开始一个Django项目。这将创建一个同名子目录来保存代码,并在当前目录中创建一个管理脚本。确保在命令的末尾包含点符号.,以便正确设置:

  1. django-admin startproject myproject .

 

Django和虚拟环境设置好后,您可以开始配置Django的数据库设置。

第四步 – 配置Django数据库设置

现在您已经有了一个项目,需要配置它以使用您创建的数据库。

使用您首选的文本编辑器打开位于子项目目录中的主Django项目设置文件。在本示例中,我们使用nano编辑器。

  1. nano ~/myproject/myproject/settings.py

 

在文件的底部,有一个当前配置为使用SQLite的DATABASES部分。

~/myproject/myproject/settings.py
. . .

# Database
# https://docs.djangoproject.com/en/4.1/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}

. . .

这需要更改为使用PostgreSQL。

首先,将引擎更改为使用postgresql适配器而不是sqlite3后端。对于名称,使用您的数据库的名称。在本例中,myproject是数据库的名称。然后添加登录凭据,包括用户名、密码和连接到的主机。最后,将端口选项留空,以选择默认端口。

~/myproject/myproject/settings.py
. . .
# Database
# https://docs.djangoproject.com/en/4.1/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'myproject',
        'USER': 'myproject_user',
        'PASSWORD': 'myproject_database_password',
        'HOST': 'localhost',
        'PORT': '',
    }
}

. . .

还需要调整ALLOWED_HOSTS指令。该指令定义了允许连接到Django实例的地址或域名的白名单。任何来自Host头部的请求,如果不在该列表中,将会引发异常。Django要求您设置这个参数以防止某类安全漏洞。

在方括号中,用引号列出与您的Django服务器相关的IP地址或域名。每个条目用逗号分隔。如果您希望请求整个域和所有子域,将条目的开头加上一个点。

您可以这样添加您的Django服务器的域名和IP地址:ALLOWED_HOSTS = [‘您的域名’, ‘203.0.113.5’]。如果您希望响应您的域名及其所有子域名,请在域名前加上一个点 . :ALLOWED_HOSTS = [‘.您的域名’, ‘203.0.113.5’]。

例如,输入您的服务器域名或IP地址:

~/myproject/myproject/settings.py
. . .

ALLOWED_HOSTS = ['your_server_domain_or_IP']
. . .

整理完成后,请保存并关闭文件。如果您使用的是nano编辑器,请按下CTRL+X,然后按下y键,最后按下回车键。

步骤5 – 迁移数据库并测试您的项目

这是文章《如何在Ubuntu 22.04上使用PostgreSQL与您的Django应用程序》的第3部分(共3部分)。

现在Django的设置已经配置好了,你可以将数据结构迁移到数据库并测试服务器。

首先,创建并应用数据库的迁移。由于还没有任何数据,这将设置初始的数据库结构。首先,确保你在myproject目录中。

  1. cd ~/myproject

 

然后进行迁移并应用。

  1. python manage.py makemigrations
  2. python manage.py migrate

 

创建数据库结构后,通过输入以下内容创建一个管理账号。

  1. python manage.py createsuperuser

 

你将被要求选择一个用户名。如果你想使用与服务器相关联的用户名,你可以选择留空。然后提供一个电子邮件地址,并为账户创建一个密码。

在访问Django开发服务器之前,测试一下与数据库的连接。打开防火墙端口以允许外部连接。

  1. sudo ufw allow 8000

 

一旦你打开端口,你可以通过启动Django开发服务器来测试你的数据库是否正常运行。

  1. python manage.py runserver 0.0.0.0:8000

 

在Web浏览器中,访问您的服务器域名或IP地址,后面加上:8000,以达到Django默认的登录页面。

http://server_domain_or_IP:8000
Django index

在 URL 的末尾加上 /admin,你就可以访问管理员界面的登录屏幕。

Django admin login

请使用createsuperuser命令创建的用户名和密码登录。然后您将被带到管理员界面。

Django admin interface

当你完成探索后,你可以在终端窗口中按下CTRL+C停止开发服务器。

通过访问管理员界面,您已确认您的数据库已存储了您的用户账户信息,并且可以适当访问。

结论

在本指南中,您学习了如何安装和配置PostgreSQL作为Django项目的后端数据库。尽管SQLite在开发和轻量化生产中可以处理负载,但大多数项目受益于实施更全面功能的数据库管理系统。

为了进一步推进您的项目,阅读我们关于在Ubuntu 22.04上如何设置Django、Postgres、Nginx和Gunicorn的指南。

bannerAds