作为一个面临同样问题并且只有在结合这里提供的答案和谷歌搜索后才找到解决方案的人,我决定整理一篇完整的答案。
首先需要注意的是:在`settings.py`中放置或省略`'HOST'`都是可行的选项。然而,无论是放置还是省略`'HOST'`都会影响如何设置postgresql配置。
像
joerick的答案那样省略`'HOST'`会导致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
的陷阱):
第一个匹配连接类型、客户端地址、请求的数据库和用户名的记录用于执行身份验证。没有“回退”或“备份”:如果选择了一条记录并且身份验证失败,则不考虑后续记录。如果没有记录匹配,则拒绝访问。
要点:
确保任何具体规则在更广泛的规则之前。
现在我们已经了解了所有这些,
以下是如何在没有密码的情况下访问,一次使用'HOST'
(因此通过localhost
),一次不使用(因此通过Unix套接字)。
在本地连接
在你的settings.py
的数据库配置中指定'HOST': 'localhost'
:
'HOST': 'localhost',
'PASSWORD'
不需要,可以省略。
您需要在postgresql身份验证配置(/etc/postgresql/x.x/main/pg_hba.conf
)中设置的规则是 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
# ...
反转顺序将导致“未提供密码”错误。
通过Unix域套接字连接
不要在您的设置中放置'HOST'
键。也不需要'PASSWORD'
。
在postgresql身份验证配置中,通过Unix域套接字访问是使用类型为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
# ...
您需要提供密码。
最后提示:
在修改/etc/postgresql/x.x/pg_hba.conf
后不要忘记重新启动PostgreSQL服务:
sudo service postgresql restart
希望这对你有所帮助。编程愉快!
localhost
或Unix域套接字进行配置。这里解释了两种情况的工作原理。 - j-i-lHOST
参数。 - Pablo