Python 使用不带密码的psycopg2连接到数据库

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

我的本地主机上有一个postgres数据库,无需密码即可访问

$ 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,这需要密码。

要避免在Django
settings.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应用程序