パスワードなしでアクセスできるlocalhostに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
を構成することは可能ですか?
pg_hba.conf
を確認して、ユーザーlocalhost
からのshaoran
からの接続を許可してから、Django settingsでshaoran
のパスワードを入力するか、pg_hba.conf
でユーザーを信頼する
psql
を介して接続できるという事実は、psql -d mwt
がpg_hba.conf
で信頼済みとして設定されているデフォルトの接続値を使用するためです。たとえば、私のマシンでは、デフォルトのホストはlocalhost
ではなくlocal socket
です
驚くべきことに、答えはホストをまったく指定しないことです。これを行うと、
DATABASES = {
'default': {
'ENGINE': 'Django.db.backends.postgresql_psycopg2',
'NAME': 'mwt',
}
}
Psycopg2は、psql
と同じ方法でUnixソケットを使用して接続します。 Host
を指定すると、psycopg2はパスワードが必要なTCP/IPに接続します。
Django settings.py
md5
のこの行でpg_hba.conf
をtrust
に変更する]でパスワードを使用しないようにするには:
Host all all 127.0.0.1/32 trust
Postgresセキュリティ構成の詳細については、 このドキュメント を参照してください。
このファイルを見つけるには:
Sudo -u postgres psql -c 'SHOW hba_file;'
同じ問題に直面し、ここからのさまざまな部分を組み合わせた後に解決策を見つける誰かがグーグルのトライアルからの答えと他の発見を提示したので、私は、できれば完全な答えをまとめることにしました:
最初に注意すること:
_'Host'
_を入れるか、_settings.py
_で省略することは、実行可能なオプションです。ただし、_'Host'
_を指定するかどうかは、postgresql設定の設定方法に影響します。
joerick's answer のように_'Host'
_を省略すると、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
_トラップ)に落ちました:
接続タイプ、クライアントアドレス、要求されたデータベース、およびユーザー名が一致するfirstレコードは、認証の実行に使用されます。 「フォールスルー」または「バックアップ」はありません。1つのレコードが選択され、認証が失敗した場合、後続のレコードは考慮されません。一致するレコードがない場合、アクセスは拒否されます。
持ち帰りメッセージ:
特定のルールがより広いルールの前に来るようにしてください。
これですべてがわかったので、ここでパスワードなしでアクセスする方法を示します。1回は_'Host'
_で(そうでlocalhost
以上)、もう1回はそうでなく(つまりUnixソケットで) )。
localhost
を介した接続_'Host': 'localhost'
_のデータベース構成で_settings.py
_を指定します。
_# ...
'Host': 'localhost',
# ...
_
_'PASSWORD'
_は不要であり、省略できます。
Postgresql認証設定(_/etc/postgresql/x.x/main/pg_hba.conf
_)で設定する必要があるルールは、TYPE Host
用です。
ルールの順序に注意してください。したがって、パスワードなしでデータベース「my_database」にアクセスできるはずのユーザー「my_user」がある場合、正しい構成は次のようになります。
_# 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
_エラーが発生します。
設定に_'Host'
_キーを入れないでください。 _'PASSWORD'
_も必要ありません。
Postgresql認証構成では、Unixドメインソケットを介したアクセスはTYPE local
のルールで管理されます。
「my_user」がデータベース「my_database」への信頼できるアクセス(パスワードは不要)を取得する場合、次のような行が必要です。
_local my_database my_user trust
_
この行を配置する場所に関して、ここでのルールは、DATABASE
およびUSER
に関して、broaderルールの前に配置する必要があるということです。安全のため、_/etc/postgresql/x.x/main/pg_hba.conf
_のbeginningに置くことをお勧めします。 _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
# ...
_
パスワードを入力する必要があります。
最後のメモ:
_/etc/postgresql/x.x/pg_hba.conf
_の変更後にpostgresqlサービスを再起動することを忘れないでください:
_Sudo service postgresql restart
_
これが役に立ったと思います。ハッピーコーディング!
私は「ローカルオールオールピア」のみで生活しています。接続文字列には、ホスト、ユーザー、およびパスワードを含めないでください:postgres:/// 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 code。
# /etc/postgresql/version/cluster/pg_hba.conf:
local all postgres md5
local all all peer