Соединение Django с PostgreSQL: «Ошибка аутентификации равноправного узла» - PullRequest
114 голосов
/ 17 ноября 2011
OperationalError at /admin/

FATAL:  Peer authentication failed for user "myuser"

Это ошибка, которую я получаю, когда пытаюсь попасть на мой админ-сайт Django.Я использовал базу данных MySQL без проблем.Я новичок в PostgreSQL, но решил переключиться, потому что хост, который я в конечном итоге планирую использовать для этого проекта, не имеет MySQL.

Поэтому я решил, что могу пройти процесс установки PostgreSQL, запустить syncdb и все готово.

Проблема в том, что я не могу подключить свое приложение к базе данных.Я могу войти в PostgreSQL через командную строку или загруженное приложение для ПК.Просто не в сценарии.

Кроме того, я могу использовать manage.py shell для доступа к БД просто отлично.

Есть мысли?

Ответы [ 5 ]

207 голосов
/ 22 ноября 2011

Я посмотрел на исключение, заметил, что это связано с моими настройками соединения. Вернулся к settings.py и увидел, что у меня не было настройки хоста. Добавьте localhost и вуаля.

В моем файле settings.py не было базы данных HOST для базы данных 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
    } 
}
20 голосов
/ 08 марта 2013

Вероятно, это потому, что ваш скрипт работает под другим пользователем, чем тот, с которым вы пытаетесь соединиться ( myuser здесь). В этом случае одноранговая аутентификация не удастся. Ваше решение с HOST: "localhost" работает, потому что вы больше не используете одноранговую аутентификацию. Однако это медленнее, чем HOST: "", потому что вместо сокетов unix вы используете TCP-соединения. От Django Docs :

Если вы используете PostgreSQL, по умолчанию (пустой HOST) соединение с база данных создается через доменные сокеты UNIX («локальные» строки в pg_hba.conf). Если вы хотите подключиться через TCP-сокеты, установите HOST в «Localhost» или «127.0.0.1» (строки «host» в pg_hba.conf). В Windows вы всегда должны определять HOST, так как доменные сокеты UNIX не являются имеется.

Если вы хотите продолжать использовать сокеты, необходимы правильные настройки в pg_hba.conf. Самое простое это:

local   all         all                               trust

при комментировании всех других local строк в конфиге. Обратите внимание, что для вступления в силу этого изменения необходима перезагрузка postgres.

Но если речь идет о многопользовательской рабочей машине, вы можете использовать что-то более безопасное, например md5 (см. здесь для объяснения различных методов аутентификации).

14 голосов
/ 07 июля 2012

Лучше, чем полное доверие, просто установить его на md5.

# "local" is for Unix domain socket connections only
local   all         all                           md5
6 голосов
/ 02 июня 2012

Я исправил это, отредактировав нижнюю часть /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
4 голосов
/ 31 июля 2015

Я просто наткнулся на ту же проблему, но хотел использовать сокеты unix, как сказал clime, но все еще используя метод peer.Я сопоставил свое системное имя пользователя с postgres-username внутри pg_hba.conf, который работает с методом peer.

Внутри pg_hba.conf Я добавил:

local all all peer map=map-name

Внутриpg_ident.conf я добавил:

map-name mysystem-username mypostgres-username
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...