Django连接到PostgreSQL:“对等authentication失败”

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

这是我正在尝试访问我的Djangopipe理站点时收到的错误。 我一直在使用MySQL数据库没有问题。 我是PostgreSQL的新手,但决定切换,因为我最终打算使用这个项目的主机没有MySQL。

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

问题是,我似乎无法让我的应用程序连接到数据库。 我可以通过我下载的命令行或桌面应用程序login到PostgreSQL。 只是不在脚本中。

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

有什么想法吗?

我看了一下例外,发现它必须做我的连接设置。 回到settings.py ,看到我没有一个主机设置。 添加localhost和瞧。

我的settings.py没有MySQL数据库的HOST,但我需要添加一个PostgreSQL才能工作。

在我的情况下,我添加localhostHOST设置,它的工作。

这是我的settings.pyDATABASES部分。

 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在这里)。 在这种情况下,对等validation将失败。 您的解决scheme与HOST: "localhost"作品,因为你不使用peer auth了。 但是,它比HOST: ""慢,因为不使用unix套接字,而是使用TCP连接。 从Django文档 :

如果您使用PostgreSQL,默认情况下(空HOST),通过UNIX域套接字(pg_hba.conf中的“本地”行)完成到数据库的连接。 如果要通过TCP套接字进行连接,请将HOST设置为“localhost”或“127.0.0.1”(pg_hba.conf中的“主机”行)。 在Windows上,您应该始终定义HOST,因为UNIX域套接字不可用。

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

 local all all trust 

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

但是,如果多用户生产机器出现问题,则可能需要使用像md5这样的更安全的东西(请参阅此处以了解各种authentication方法的说明)。

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

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

我通过编辑/etc/postgres/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的postgres-username映射了我的系统用户名,这个pg_hba.confpeer方法一起工作。

pg_hba.conf里面我添加了:

 local all all peer map=map-name 

pg_ident.conf里面我添加了:

 map-name mysystem-username mypostgres-username