Python 使用不带密码的psycopg2连接到数据库
我的本地主机上有一个postgres数据库,无需密码即可访问Python 使用不带密码的psycopg2连接到数据库,python,django,postgresql,psycopg2,Python,Django,Postgresql,Psycopg2,我的本地主机上有一个postgres数据库,无需密码即可访问 $ psql -d mwt psql (8.4.12) Type "help" for help. mwt=# SELECT * from vatid; id | requester_vatid |... -----+-----------------|... 1719 | IT00766780266 |... 我想从django访问那个数据库。所以我加入了数据库 DATABASES = { 'd
$ psql -d mwt
psql (8.4.12)
Type "help" for help.
mwt=# SELECT * from vatid;
id | requester_vatid |...
-----+-----------------|...
1719 | IT00766780266 |...
我想从django访问那个数据库。所以我加入了数据库
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
我尝试使用密码:'
,但收到了相同的错误消息。我尝试使用密码:None
,但也没用
我一直在搜索django文档,但找不到任何有用的东西。可以将
django.db.backends.postgresql\u psycopg2
配置为接受空密码?检查pg\u hba.conf
以允许用户shaoran
从本地主机连接,然后在Django设置中提供shaoran
的密码,或者在pg_hba.conf中信任用户
您可以通过psql
进行连接,这是因为psql-d mwt
使用了一些默认连接值,这些值在pg_hba.conf
中设置为可信。例如,在我的机器上,默认主机是localsocket
,而不是localhost
,令人惊讶的是,答案是根本不指定主机。如果你这样做
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'mwt',
}
}
然后,psycopg2将使用Unix套接字以与psql
相同的方式进行连接。当您指定主机时,psycopg2将连接TCP/IP,这需要密码。要避免在Djangosettings.py中使用密码,请在这行pg_hba.conf
中将md5
更改为trust
:
host all all 127.0.0.1/32 trust
有关postgres安全配置的详细了解,请阅读
要查找此文件,请执行以下操作:
sudo -u postgres psql -c 'SHOW hba_file;'
作为一个面临同样问题的人,只有在综合了当前答案的各个部分和谷歌ing试验的其他发现后才能找到解决方案,我决定整理出一个完整的答案:
首先要注意的是:
在设置中放置'HOST'
或省略它都是可行的选择。
但是,是否放置“主机”
会影响您必须如何设置postgresql配置。
在中省略“主机”
会导致psycopg2试图通过Unix域套接字进行连接。另一方面,如果您的配置包含“主机”
键,则psycopg2将尝试通过IPv4/6本地主机连接。由于postgresql身份验证配置(/etc/postgresql/x.x/main/pg_hba.conf
)特定于这两种连接方式中的任何一种,因此这会产生很大的差异
带回家的信息:
确保选择您在postgresql身份验证配置中配置的连接类型
第二点要注意的是:
postgresql身份验证配置(/etc/postgresql/x.x/main/pg_hba.conf
)关心条目的顺序。
事实上,我非常清楚这一点(但我成功地落入了本地所有对等方的陷阱):
第一个记录带有匹配的连接类型、客户端地址、请求的数据库和用户名,用于执行身份验证。不存在“故障排除”或“备份”:如果选择了一条记录,并且身份验证失败,则不考虑后续记录。如果没有匹配的记录,则拒绝访问
带回家的信息:
确保任何特定的规则优先于更广泛的规则
现在我们已经知道了所有这些,下面是如何在没有密码的情况下获得访问权限,一次使用'HOST'
(通过localhost
),一次不使用(通过Unix套接字)
通过localhost连接
在设置的数据库配置中指定'HOST':'localhost'
。py
:
# ...
'HOST': 'localhost',
# ...
“密码”
是不需要的,可以省略
您需要在postgresql身份验证配置(/etc/postgresql/x.x/main/pg_hba.conf
)中设置的规则是针对主机类型的
注意规则的顺序。因此,如果您有一个用户“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
# ...
local my_database my_user trust
# RIGHT WAY...
local my_database my_user trust
# ...
local all all peer
# ...
颠倒顺序将导致未提供密码
错误
通过Unix域套接字连接
不要将“主机”
键放入您的设置中。
“密码”
也不需要
在postgresql身份验证配置中,通过Unix域套接字的访问由local
类型的规则管理
如果“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
# ...
local my_database my_user trust
# RIGHT WAY...
local my_database my_user trust
# ...
local all all peer
# ...
关于这一行的位置,这里的规则是,您需要将它放在数据库
和用户
的任何更广泛规则之前。为了安全起见,我建议将它放在/etc/postgresql/x.x/main/pg_hba.conf
的开头。如果您的pg_hba.conf
文件如下所示:
# 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
# ...
local my_database my_user trust
# 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
希望这是有帮助的。快乐编码 我只和“本地所有同龄人”住在一起。连接字符串不应包含主机、用户和密码:postgres:///mydbname.
如果没有环境模块,它看起来是这样的:
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文件不包含任何数据库URL设置
仅对于用户“postgres”,我使用md5,但仅来自psql/pgadmin3,而不是来自django代码
# /etc/postgresql/version/cluster/pg_hba.conf:
local all postgres md5
local all all peer
我认为pg_hba.conf没有问题。实际上,这个mwt数据库用于rails应用程序