подключение к БД с помощью 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