作为一个面临同样问题的人,并且只有在结合了此处现有答案的各个部分和 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
关于把这条线放在哪里,这里的规则是你需要把它放在任何更广泛的规则之前DATABASE
和USER
。为了安全起见,我建议把它放在. /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
希望这会有所帮助。快乐编码!