подключение к БД с помощью psycopg2 без пароля

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

$ 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 принять пустой пароль?

5 ответов


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

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


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

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

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


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

host    all             all             127.0.0.1/32            trust

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

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

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

как кто-то сталкивается с той же проблемой и только найти решение после объединения различных частей из здесь присутствующих ответов и других выводов из Google-ING испытаний, я решил собрать, надеюсь, полный ответ:

Первое, что нужно отметить:

ставим 'HOST' или опустить его в settings.py жизнеспособные варианты. Впрочем, ставите ли вы 'HOST' или не влияет на то, как вы должны настроить postgresql конфигурация.

опущение 'HOST' а в joerick это ведет к psycopg2 пытается подключиться к сокет Unix. С другой стороны, если ваша конфигурация содержит 'HOST' ключ, psycopg2 попытается подключиться через IPv4 / 6 localhost. Это имеет большое значение в качестве конфигурации аутентификации postgresql (/etc/postgresql/x.x/main/pg_hba.conf) специфичен для любого из этих способов подключения.

возьмите домой сообщение:

обязательно выберите тип соединения, который вы также настроили в конфигурации аутентификации postgresql.

второе, что нужно отметить:

конфигурация аутентификации postgresql (/etc/postgresql/x.x/main/pg_hba.conf) заботится о порядке записи.

документы на самом деле очень ясно говорит об этом, (все же мне удалось упасть в local all all peer ловушка!--34-->):

на первый для проверки подлинности используется запись с соответствующим типом соединения, адресом клиента, запрашиваемой базой данных и именем пользователя. Нет "провала" или "резервного копирования": если выбрана одна запись и проверка подлинности завершается неудачно, последующие записи не рассматриваются. Если запись не совпадает, доступ запрещен.

возьмите домой сообщение:

убедитесь, что любое конкретное правило перед нами более широкие правила.


теперь, когда мы все это знаем,вот как получить доступ без пароля, только с 'HOST' (so over localhost) и один раз без (так над сокетом Unix).


подключение localhost

указать 'HOST': 'localhost' в конфигурации базы данных settings.py:

# ...
'HOST': 'localhost',
# ...

'PASSWORD' не требуется и может быть опущено.

правило, которое вам нужно чтобы установить конфигурацию аутентификации postgresql (/etc/postgresql/x.x/main/pg_hba.conf) для типа host.

следите за порядком правил. Итак, если у вас есть пользователь "my_user", который должен иметь доступ к базе данных "my_database" без пароля, правильная конфигурация будет выглядеть так:

# RIGHT WAY...
host my_database my_user 127.0.0.1/32 trust
host my_database my_user ::1/128 trust
# ...
host all all 127.0.0.1/32 peer
# ...

Инвертирование заказа приведет к no password supplied ошибка.


подключение через доменный сокет Unix

не поставить 'HOST' key in ваши параметры. 'PASSWORD' не нужны.

в конфигурации аутентификации postgresql доступ через доменные сокеты Unix управляется правилами типа local.

если "my_user" должен получить доверенный (не требуется пароль) доступ к базе данных "my_database", вам нужна такая строка:

local my_database my_user trust

относительно того, где поставить эту строку, правило здесь заключается в том, что вам нужно поставить его перед любым широкое правила в отношении DATABASE и USER. Чтобы быть в безопасности, я рекомендую поместить его в начало of /etc/postgresql/x.x/main/pg_hba.conf. Если pg_hba.conf файл выглядит так:

# RIGHT WAY...
local my_database my_user trust
# ...
local all all peer
# ...

вы хорошо идти без пароля. Однако, если это выглядит так:

# WRONG WAY! ...
local all all peer
# ...
local my_database my_user trust
# ...

вам нужно будет указать пароль.


Конечная нота:

не забудьте перезапустить службу postgresql после изменения /etc/postgresql/x.x/pg_hba.conf:

sudo service postgresql restart

надеюсь, это было полезно. Удачи в кодировании!


Я живу только с "local all all peer". Строка подключения должна быть без хоста, пользователя и пароля: сервер:///mydbname.

без модуля environ он выглядит так:

DATABASES = {
    'default': {'NAME': 'mydatabase', 'USER': '', 'PASSWORD': '', 'HOST': '', 'PORT': '', 'ENGINE': 'django.db.backends.postgresql_psycopg2'}
}

С модулем environ:

import environ
env = environ.Env()
DATABASES = {
    'default': env.db('DATABASE_URL', default='postgres:///mydatabase'),
}

где .файл env не содержит параметра DATABASE_URL.

только для пользователя "postgres" я использую md5, но только из psql/pgadmin3, а не из кода django.

# /etc/postgresql/version/cluster/pg_hba.conf:
local all postgres md5
local all all peer