Django 连接到 PostgreSQL:"Peer authentication failed"


OperationalError at /admin/
FATAL:  Peer authentication failed for user "myuser"

这是我收到的错误,当我试图得到我的Django管理网站。我一直在使用MySQL数据库,没有问题。我是PostgreSQL的新手,但决定切换,因为我最终计划在这个项目中使用的主机没有MySQL。

因此,我想我可以通过安装PostgreSQL的过程,运行一个syncdb,并设置好。

问题是,我似乎不能让我的应用程序连接到数据库。我可以通过命令行或我下载的桌面应用程序登录PostgreSQL。只是剧本里没有。

同样,我可以使用manage.py shell来访问数据库。

任何想法吗?

我偷看了一下异常,注意到它与我的连接设置有关。回到settings.py,发现没有主机设置。加入localhost,瞧!

我的settings.py没有MySQL数据库的主机,但是我需要为PostgreSQL添加一个主机。

在我的例子中,我将localhost添加到HOST设置中并且它工作了。

这是DATABASES部分从我的settings.py

DATABASES = { 
    'default': { 
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': '<MYDATABASE>', 
        'USER': '<MYUSER>', 
        'PASSWORD': '<MYPASSWORD>', 
        'HOST': 'localhost', # the missing piece of the puzzle 
        'PORT': '', # optional, I don't need this since I'm using the standard port
    } 
}

这可能是因为您的脚本运行在其他用户下,而不是您试图连接的用户(此处myuser)。在这种情况下,对等体身份验证将失败。您使用HOST: "localhost"的解决方案可以工作,因为您不再使用对等身份验证。但是,它比HOST: ""慢,因为使用的不是unix套接字,而是TCP连接。来自django docs:

如果你正在使用PostgreSQL,默认情况下(空HOST),连接到数据库是通过UNIX域套接字(' local '行)完成的pg_hba.conf)。如果您希望通过TCP套接字连接,请将HOST设置为' localhost '或' 127.0.0.1 ' (' host '行在pg_hba.conf)。在Windows上,您应该始终定义HOST,因为UNIX域套接字没有定义HOST可用。

如果您想继续使用套接字,需要在pg_hba.conf中正确设置。最简单的是:

local   all         all                               trust

同时注释掉配置中的所有其他local行。请注意,需要重新加载postgres才能生效。

但是,如果多用户生产机器存在问题,您可能希望使用更安全的东西,如md5(请参阅此处了解各种身份验证方法的解释)。

将其设置为md5比完全信任更好。

# "local" is for Unix domain socket connections only
local   all         all                           md5

我通过编辑/etc/postgresg/9.1/main/pg_hba.conf的底部来修复这个问题(将md5更改为trust;注意:这意味着没有数据库密码,这可能不是你想要的)

# TYPE  DATABASE    USER        CIDR-ADDRESS          METHOD
# "local" is for Unix domain socket connections only
local   all         all                               trust
# IPv4 local connections:
host    all         all         127.0.0.1/32          trust
# IPv6 local connections:
host    all         all         ::1/128               trust

我只是偶然发现了同样的问题,但想使用unix套接字作为clime说,但仍然使用peer方法。我在pg_hba.conf中映射了我的系统用户名和postgresql用户名,这与peer方法一起工作。

Inside pg_hba.conf i add:

local all all peer map=map-name

Inside pg_ident.conf i add:

map-name mysystem-username mypostgres-username

最新更新