Pab*_*blo 44 python django postgresql psycopg2
我在localhost上有一个postgres数据库,我可以在没有密码的情况下访问
$ psql -d mwt
psql (8.4.12)
Type "help" for help.
mwt=# SELECT * from vatid;
id | requester_vatid |...
-----+-----------------|...
1719 | IT00766780266 |...
Run Code Online (Sandbox Code Playgroud)
我想从django访问该数据库.所以我投入了DATABASES
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'mwt',
'USER': 'shaoran',
'HOST': 'localhost'
}
}
Run Code Online (Sandbox Code Playgroud)
由于我不需要密码来访问我的测试数据库,因此我没有PASSWORD
在设置中提供任何值.
$ ./manage.py shell
>>> from polls.models import Vatid
>>> Vatid.objects.all()
connection_factory=connection_factory, async=async)
OperationalError: fe_sendauth: no password supplied
Run Code Online (Sandbox Code Playgroud)
我尝试使用,PASSWORD: ''
但我收到相同的错误消息.我尝试使用,PASSWORD: None
但这也没有帮助.
我一直在搜索关于这个的django文档,但我找不到任何有用的东西.可以配置django.db.backends.postgresql_psycopg2
为接受空密码?
joe*_*ick 59
令人惊讶的是,答案是根本不指定主机.如果你这样做,
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'mwt',
}
}
Run Code Online (Sandbox Code Playgroud)
然后psycopg2将以与Unix套接字相同的方式连接psql
.当您指定a时HOST
,psycopg2将连接TCP/IP,这需要密码.
b_d*_*dev 26
为避免在Django中使用密码,请settings.py
更改md5
为trust
以下行pg_hba.conf
:
host all all 127.0.0.1/32 trust
Run Code Online (Sandbox Code Playgroud)
有关postgres安全配置的详细信息,请阅读本文档.
要找到此文件:
sudo -u postgres psql -c 'SHOW hba_file;'
Run Code Online (Sandbox Code Playgroud)
okm*_*okm 12
检查您的用户是否pg_hba.conf
允许连接,然后提供Django设置的密码或信任该用户localhost
shaoran
shaoran
pg_hba.conf
您可以连接的事实psql
是因为psql -d mwt
使用了一些默认连接值,这些值被设置为受信任的pg_hba.conf
.例如,在我的机器上,默认主机local socket
代替localhost
作为面临相同问题的人,只有结合了此处给出的答案和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
陷阱):
具有匹配的连接类型,客户端地址,请求的数据库和用户名的第一条记录用于执行身份验证。没有“失败”或“备份”:如果选择了一条记录并且验证失败,则不会考虑后续记录。如果没有记录匹配,则拒绝访问。
带回家的消息:
确保在更广泛的规则之前有任何特定的规则。
既然我们都知道了,这里是如何不用密码访问一次,一次使用'HOST'
(so over localhost
),一次不使用(so over Unix socket)。
localhost
'HOST': 'localhost'
在您的数据库配置中指定settings.py
:
# ...
'HOST': 'localhost',
# ...
Run Code Online (Sandbox Code Playgroud)
'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
# ...
Run Code Online (Sandbox Code Playgroud)
颠倒顺序将导致no password supplied
错误。
请勿将'HOST'
按键放在您的设置中。
'PASSWORD'
也不需要。
在postgresql身份验证配置中,使用TYPE规则管理通过Unix域套接字的访问local
。
如果“ my_user”应该被信任(不需要密码)对数据库“ my_database”的访问,则需要这样的一行:
local my_database my_user trust
Run Code Online (Sandbox Code Playgroud)
至于在哪里,就把这行,这里的规则是,你需要把它放在任何以前更广泛的方面规则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
# ...
Run Code Online (Sandbox Code Playgroud)
您可以不用密码了。但是,如果看起来像这样:
# WRONG WAY! ...
local all all peer
# ...
local my_database my_user trust
# ...
Run Code Online (Sandbox Code Playgroud)
您需要提供密码。
最后说明:
修改后,请不要忘记重新启动postgresql服务/etc/postgresql/x.x/pg_hba.conf
:
sudo service postgresql restart
Run Code Online (Sandbox Code Playgroud)
希望这会有所帮助。编码愉快!
归档时间: |
|
查看次数: |
33799 次 |
最近记录: |