48

我的本地主机上有一个 postgres 数据库,无需密码即可访问

$ psql -d mwt
psql (8.4.12)
Type "help" for help.

mwt=# SELECT * from vatid;
  id   | requester_vatid |...
  -----+-----------------|...   
  1719 | IT00766780266   |...

我想从 django 访问该数据库。所以我投入DATABASES

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'mwt',
        'USER': 'shaoran',
        'HOST': 'localhost'
    }
}

由于我不需要密码来访问我的测试数据库,因此我没有PASSWORD在设置中提供任何值。

$ ./manage.py shell
>>> from polls.models import Vatid
>>> Vatid.objects.all()
  connection_factory=connection_factory, async=async)
  OperationalError: fe_sendauth: no password supplied

我尝试使用PASSWORD: '',但收到相同的错误消息。我尝试使用PASSWORD: None,但这也无济于事。

我一直在搜索有关此的 django 文档,但找不到任何有用的东西。可以配置django.db.backends.postgresql_psycopg2接受空密码吗?

4

5 回答 5

67

令人惊讶的是,答案是根本不指定主机。如果你这样做,

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'mwt',
    }
}

然后 psycopg2 将使用 Unix 套接字以与psql. 当您指定 aHOST时,psycopg2 将使用 TCP/IP 连接,这需要密码。

于 2014-05-26T13:46:30.180 回答
28

为了避免在 Django 中使用密码,请settings.py更改md5trust以下行pg_hba.conf

host    all             all             127.0.0.1/32            trust

如需详细了解 postgres 安全配置,请阅读此文档。

要找到此文件:

sudo -u postgres psql -c 'SHOW hba_file;'
于 2014-11-12T22:46:47.403 回答
12

检查您pg_hba.conf是否允许来自localhost用户的连接shaoran,然后在 Django 设置中提供密码shaoran或信任用户pg_hba.conf

您可以通过连接的事实psql是因为psql -d mwt使用了一些设置为受信任的默认连接值pg_hba.conf。例如,在我的机器上,默认主机local socketlocalhost

于 2012-06-25T15:36:53.490 回答
6

作为一个面临同样问题的人,并且只有在结合了此处现有答案的各个部分和 google-ing 试验的其他发现后才找到解决方案,我决定整理一个有希望的完整答案

首先要注意

放入'HOST'或忽略它settings.py都是可行的选择。但是,是否放置'HOST'会影响您必须如何设置 postgresql 配置。

'HOST'joerick 的回答中省略会导致 psycopg2 尝试通过 Unix 域套接字连接。另一方面,如果您的配置包含'HOST'密钥, psycopg2 将尝试通过 IPv4/6 进行连接localhost。这有很大的不同,因为 postgresql 身份验证配置 ( /etc/postgresql/x.x/main/pg_hba.conf) 特定于这些连接方式中的任何一种。

带回家留言:

确保选择您也在 postgresql 身份验证配置中配置的连接类型。

需要注意的第二点:

postgresql 身份验证配置 ( /etc/postgresql/x.x/main/pg_hba.conf) 关心条目的顺序。

文档实际上对此非常清楚,(但我设法落入了local all all peer陷阱):

具有匹配连接类型、客户端地址、请求的数据库和用户名的第一条记录用于执行身份验证。没有“fall-through”或“backup”:如果选择了一条记录并且认证失败,则不考虑后续记录。如果没有记录匹配,则拒绝访问。

带回家留言:

确保任何特定规则出现在更广泛的规则之前。


现在我们知道了所有这些,这里是如何在没有密码的情况下访问,一次使用'HOST'(so over localhost) 一次没有 (so over Unix socket)


连接结束localhost

'HOST': 'localhost'在您的数据库配置中指定settings.py

# ...
'HOST': 'localhost',
# ...

'PASSWORD'不需要,可以省略。

您需要在 postgresql 身份验证配置 ( /etc/postgresql/x.x/main/pg_hba.conf) 中设置的规则适用于 TYPE host

注意规则的顺序。因此,如果您的用户“my_user”应该能够在没有密码的情况下访问数据库“my_database”,那么正确的配置应该如下所示:

# RIGHT WAY...
host my_database my_user 127.0.0.1/32 trust
host my_database my_user ::1/128 trust
# ...
host all all 127.0.0.1/32 peer
# ...

颠倒排序将导致no password supplied错误。


通过 Unix 域套接字连接

不要将'HOST'密钥放在您的设置中。 'PASSWORD'也不需要。

在 postgresql 身份验证配置中,通过 Unix 域套接字的访问由 TYPE 规则管理local

如果“my_user”应该得到信任(不需要密码)访问数据库“my_database”,你需要这样的一行:

local my_database my_user trust

关于把这条线放在哪里,这里的规则是你需要把它放在任何更广泛的规则之前DATABASEUSER。为了安全起见,我建议把它放在. /etc/postgresql/x.x/main/pg_hba.conf如果您的pg_hba.conf文件如下所示:

# RIGHT WAY...
local my_database my_user trust
# ...
local all all peer
# ...

你很高兴没有密码。但是,如果它看起来像这样:

# WRONG WAY! ...
local all all peer
# ...
local my_database my_user trust
# ...

您需要提供密码。


最后说明:

修改后不要忘记重启postgresql服务/etc/postgresql/x.x/pg_hba.conf

sudo service postgresql restart

 

         希望这会有所帮助。快乐编码!

于 2018-02-21T16:00:53.023 回答
2

我只和“本地所有同行”住在一起。连接字符串应该没有主机、用户和密码:postgres:///mydbname。

如果没有 environ 模块,它看起来是这样的:

DATABASES = {
    'default': {'NAME': 'mydatabase', 'USER': '', 'PASSWORD': '', 'HOST': '', 'PORT': '', 'ENGINE': 'django.db.backends.postgresql_psycopg2'}
}

使用环境模块:

import environ
env = environ.Env()
DATABASES = {
    'default': env.db('DATABASE_URL', default='postgres:///mydatabase'),
}

其中 .env 文件不包含 DATABASE_URL 设置。

仅对于用户 'postgres' 我使用 md5,但仅来自 psql/pgadmin3,而不来自 django 代码。

# /etc/postgresql/version/cluster/pg_hba.conf:
local all postgres md5
local all all peer
于 2018-06-12T06:22:53.453 回答