Debian 8如何使用Postgresql和Django应用程序

介绍

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

在本教材中,我们将演示如何安装和配置PostgreSQL和Django。我们将安装必要的软件,为我们的应用程序创建数据库实例,然后启动并配置一个新的Django项目以使用此后端。您也可以直接使用腾讯云数据库PostgreSQL ,为了让您更好的了解并使用云数据库 PostgreSQL,腾讯云提供了云数据库PostgreSQL 的API文档操作实例

准备

具有sudo权限的非root用户的Debian 8,没有服务器的同学可以在这里购买

从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提示符下以分号结束所有命令。

postgres=# CREATE DATABASE myproject;
CREAT DATABASE

接下来,我们将创建一个数据库用户,我们将用它来连接数据库并与之交互。将密码设置为强大且安全的密码:

postgres=# CREATE USER myprojectuser WITH PASSWORD 'password';
CREATE ROLE

接下来,我们将为刚刚创建的用户修改一些连接参数。这将加速数据库操作,因为每次建立连接时都不必查询和设置正确的值。

我们将默认编码设置为UTF-8,这是Django期望的格式。我们还将默认事务隔离方案设置为“read committed”,它阻止从未提交的事务中读取。最后,我们正在设定时区。默认情况下,我们的Django项目将设置为使用UTC。

postgres=# ALTER ROLE myprojectuser SET client_encoding TO 'utf8';
postgres=# ALTER ROLE myprojectuser SET default_transaction_isolation TO 'read committed';
postgres=# ALTER ROLE myprojectuser SET timezone TO 'UTC';
ALTER ROLE
ALTER ROLE
ALTER ROLE

现在,我们需要做的就是为我们创建的数据库提供数据库用户访问权限:

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

完成后退出SQL提示符。

postgres=# \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)。

(venv) $ pip install django psycopg2

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

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

(venv) $ django-admin.py startproject myproject .

您当前的目录结构应如下所示:

.
└── ./myproject/
    ├── manage.py
    ├── myproject/
    │   ├── __init__.py
    │   ├── settings.py
    │   ├── urls.py
    │   └── wsgi.py
    └── venv/
        └── . . .

如您所见,我们有一个父项目目录,其中包含manage.py脚本,内部项目目录以及我们之前创建的venv虚拟环境目录。

配置Django数据库设置

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

打开位于子项目目录中的主要的Django项目设置文件:

(venv) $ nano ~/myproject/myproject/settings.py

在我们设置数据库之前,您可能还需要调整ALLOWED_HOSTS指令。这定义了可用于连接Django实例的地址或域名的白名单。具有不在此列表中的主机头的任何传入请求都将引发异常。Django要求您将其设置为防止某类安全漏洞。

在方括号中,列出与Django服务器关联的IP地址或域名。每个项目都应该在引号中列出,用逗号分隔。如果您希望响应域和子域的任何请求,在后面添加.。在下面的代码段中,有一些注释掉的示例用于演示ALLOWED_HOSTS指令的正确方法:

〜/ 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设置,我们可以将数据结构迁移到数据库并测试服务器。

我们可以从创建和应用迁移到我们的数据库开始。由于我们还没有任何实际数据,这只是设置初始数据库结构:

(venv) $ cd ~/myproject
(venv) $ ./manage.py makemigrations
(venv) $ ./manage.py migrate

创建数据库结构后,我们可以通过输入以下内容来创建管理帐户:

(venv) $ ./manage.py createsuperuser

系统将要求您选择用户名,提供电子邮件地址,然后选择并确认该帐户的密码。

注意:在尝试开发服务器之前,请确保打开防火墙中的端口。

如果您正在运行ufw防火墙,可以通过输入以下命令打开相应的端口:

(venv) $ sudo ufw allow 8000

如果您运行的是iptables防火墙,则所需的确切命令取决于您当前的防火墙配置。对于大多数配置,此命令应该起作用:

(venv) $ sudo iptables -I INPUT -p tcp --dport 8000 -j ACCEPT

接下来,您可以通过启动Django开发服务器来测试您的数据库是否正常运行:

(venv) $ ./manage.py runserver 0.0.0.0:8000

在Web浏览器中,访问服务器的域名或IP地址,然后通过:8000访问默认的Django根页面:

http://server_domain_or_IP:8000

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

默认索引页面

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

登陆界面

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

管理界面

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

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

我们可以通过使用psql客户端查询Postgres数据库本身来进一步验证这一点。

例如,我们可以使用项目的用户(myprojectuser)连接到我们的项目数据库(myproject),并通过输入以下内容打印出所有可用的表:

(venv) $ psql -W myproject myprojectuser -h 127.0.0.1 -f <(echo '\dt')

-W标志使psql提示您输入适当的密码。我们必须明确使用-h标志通过网络连接到localhost,以指示我们要使用密码身份验证而不是对等身份验证。我们使用-f标志传递我们想要执行的psql元命令,\ dt,它列出了数据库中的所有表:

   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中受益。


参考文献:《How To Use Postgresql with your Django Application on Debian 8》

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏张戈的专栏

zabbix agentd客户端插件Shell一键自动安装脚本

这次生产环境上线了多台 Linux 服务器,需要全部纳入 Zabbix 监控范畴,一台一台的去装 Zabbix Agentd 插件那就太苦逼了,所幸 Zabbi...

36250
来自专栏Golang语言社区

网游内存数据库的设计(2)

续第一篇,前两天对核心存储做了些修改,以前只打算与关系数据库的行与表做对应,value类型只能使array或list, 现在把7种基本类型也加入到value支持...

32340
来自专栏PHP实战技术

高可用架构-- MySQL主从复制的配置

环境 操作系统:CentOS-6.6-x86_64-bin-DVD1.iso MySQL版本:mysql-5.6.26.tar.gz 主节点IP:192.168...

36970
来自专栏有趣的django

4. sudo,PATH环境变量,修改字符集,ntpserver,加大文件描述符,隐藏内核版本,锁定关键系统文件

1   命令:  visudo            98gg      98行             yy           复制当前行         ...

35260
来自专栏aoho求索

基于可靠消息方案的分布式事务(三):Lottor使用

前面两篇文章介绍了笔者关于可靠消息方案的分布式事务的实现思路以及Java中的事务概念,奈何工作抽不出时间,如今时隔已久,分布式事务系列拖了很久,一直没能好好把项...

9510
来自专栏coding

mac 搭建selenium与ChromeDriver环境安装 selenium安装 ChromeDriver验证安装

下载后,将安装包加入到环境变量。以mac系统为例,将chromedriver移至/usr/bin目录下即可

1K20
来自专栏Golang语言社区

网游内存数据库的设计(2)

续第一篇,前两天对核心存储做了些修改,以前只打算与关系数据库的行与表做对应,value类型只能使array或list, 现在把7种基本类型也加入到value支持...

37680
来自专栏xingoo, 一个梦想做发明家的程序员

[Oracle入门级]知识概况

oracle各个版本间的主要技术更新 oracle 8 增加数据库创建和存储对象 oracle 8i 整体性能提升 oracle9i 实施应用集群 oracle...

19260
来自专栏北京马哥教育

64位CentOS6安装MySQL-5.7.13-linux-glibc2.5-x86_64.tar.gz

作者:云上之山 来源:http://blog.csdn.net/nengyu/article/details/51615836 1.从官网下载 mysql-5....

36480
来自专栏杂烩

hbase1.2.4安装 原

匹配的hadoop2.6.0,假设hadoop已经正确安装并启动,假设zookeeper已经正确安装并启动。

8030

扫码关注云+社区

领取腾讯云代金券