作为一个面临同样问题的人,并且只有在结合了此处现有答案的各个部分和 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
希望这会有所帮助。快乐编码!