Подтвердить что ты не робот

Подключиться к базе данных с помощью psycopg2 без пароля

У меня есть база данных postgres на моем локальном хосте, к которому я могу получить доступ без пароля

$ psql -d mwt
psql (8.4.12)
Type "help" for help.

mwt=# SELECT * from vatid;
  id   | requester_vatid |...
  -----+-----------------|...   
  1719 | IT00766780266   |...

Я хочу получить доступ к этой базе данных из django. Поэтому я ввел DATABASES

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

Я попытался использовать PASSWORD: '', но я получаю то же сообщение об ошибке. Я пытался использовать PASSWORD: None, но это тоже не помогло.

Я искал документацию django об этом, но я не могу найти ничего полезного. Можно настроить django.db.backends.postgresql_psycopg2 принимать пустой пароль?

4b9b3361

Ответ 1

Проверьте pg_hba.conf, чтобы разрешить подключение localhost пользователем shaoran, либо укажите пароль shaoran в настройках Django или доверьтесь пользователю в pg_hba.conf

Тот факт, что вы можете подключиться через psql, состоит в том, что psql -d mwt использует некоторые значения соединения по умолчанию, которые установлены как доверенные в pg_hba.conf. Например, на моей машине хостом по умолчанию является local socket вместо localhost

Ответ 2

Удивительно, но ответ заключается в том, чтобы не указывать хост вообще. Если вы это сделаете,

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'mwt',
    }
}

Затем psycopg2 будет подключаться с помощью гнезда Unix таким же образом, как psql. Когда вы укажете HOST, psycopg2 будет подключаться к TCP/IP, для которого требуется пароль.

Ответ 3

Чтобы избежать использования пароля в Django settings.py измените md5 на trust в этой строке pg_hba.conf:

host    all             all             127.0.0.1/32            trust

Для более детального понимания конфигураций безопасности postgres читайте этот документ.

Чтобы найти этот файл:

sudo -u postgres psql -c 'SHOW hba_file;'