Django与PostgreSQL的连接:"对等身份验证失败"

The*_*ter 115 django postgresql

OperationalError at /admin/

FATAL:  Peer authentication failed for user "myuser"
Run Code Online (Sandbox Code Playgroud)

当我尝试访问我的Django管理站点时,这是我收到的错误.我一直在使用MySQL数据库没问题.我是PostgreSQL的新手,但决定切换,因为我最终计划用于此项目的主机没有MySQL.

因此,我想我可以通过安装PostgreSQL的过程,运行一个syncdb并且全部设置.

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

此外,我可以使用manage.py shell访问数据库就好了.

有什么想法吗?

The*_*ter 211

我看了一眼异常,注意到它与我的连接设置有关.回到settings.py,看到我没有主机设置.添加localhost并瞧.

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

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

这是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
    } 
}
Run Code Online (Sandbox Code Playgroud)

  • 当HOST为空时,Django尝试使用UNIX套接字连接到数据库.另一方面,当HOST是"localhost"时,它通过TCP/IP连接到127.0.0.1.可能,你的`pg_hba.conf`被设置为拒绝普通用户通过UNIX套接字连接,但允许他们通过localhost上的TCP/IP. (7认同)
  • 您可以考虑将解决方案从您的问题转移到您的答案(并接受它).通过这种方式,问题仍然是一个问题,它将适当地提供答案.顺便说一句:干得好!:-) (5认同)
  • 与Rails应用程序有同样的问题,它是相同的解决方案 - 主机需要在`config/database.yml`中配置 - 也就是说,在该文件中我需要添加行`host:localhost` (或者你postgres服务器的任何地方 - 我是本地的) (3认同)
  • 文档(https://docs.djangoproject.com/en/1.6/ref/settings/#host)在于:"HOST [...]空字符串表示localhost".这不是真的,我有同样的问题,我修复它写'localhost'.谢谢你的提示. (3认同)

cli*_*ime 20

这可能是因为您的脚本在您尝试连接的用户之外的其他用户下运行(myuser here).在这种情况下,对等身份验证将失败.您的解决方案HOST: "localhost"有效,因为您不再使用对等身份验证.但是,它比HOST: ""使用TCP连接更慢,而不是使用unix套接字.来自django docs:

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

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

local   all         all                               trust
Run Code Online (Sandbox Code Playgroud)

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

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

  • 这应该是anwer ...(更多文档,更多解释) (2认同)

Hou*_*man 14

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

# "local" is for Unix domain socket connections only
local   all         all                           md5
Run Code Online (Sandbox Code Playgroud)

  • +1; 但是注意md5通常(稍微)比密码更好,因为它将发送哈希而不是密码.(当地方并不重要;但如果通过网络进行可能的窃听,这是很重要的.) (5认同)

vis*_*ish 6

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

# 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
Run Code Online (Sandbox Code Playgroud)


小智 5

我只是偶然发现了同样的问题,但想像clime所说的那样使用unix套接字,但仍然使用该peer方法。我将我的系统用户名映射到 中的 postgres-username pg_hba.conf,它正在使用该peer方法。

在里面pg_hba.conf我补充说:

local all all peer map=map-name
Run Code Online (Sandbox Code Playgroud)

在里面pg_ident.conf我补充说:

map-name mysystem-username mypostgres-username
Run Code Online (Sandbox Code Playgroud)