Opened 16 years ago
Closed 12 years ago
#9920 closed Bug (fixed)
Empty string is not the same as typing "localhost" in DATABASE_HOST in settings.py
Reported by: | crazy2k | Owned by: | nobody |
---|---|---|---|
Component: | Documentation | Version: | 1.0 |
Severity: | Normal | Keywords: | postgresql host localhost empty |
Cc: | alan.justino@… | Triage Stage: | Accepted |
Has patch: | yes | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description
I was reading Django's book (http://www.djangobook.com/). At Chapter 5, you start playing a little with the database server. I chose PostgreSQL, and I filled the settings accordingly. However, when I tried:
>>> from django.db import connection >>> cursor = connection.cursor()
(after running python manage.py shell)
I got an error.
I had left the DATABASE_HOST setting blank in settings.py, because it says:
DATABASE_HOST = # Set to empty string for localhost. Not used with sqlite3.
I made it work by explictly adding "localhost" there.
The version of Django I've installed is 1.0-1ubuntu1.
Attachments (1)
Change History (16)
follow-up: 3 comment:1 by , 16 years ago
comment:2 by , 16 years ago
Resolution: | → invalid |
---|---|
Status: | new → closed |
This is almost certainly a case of the server expecting a different type of connection; closing invalid because it a) works fine for me and b) references a third-party book (documentation bugs filed here should only reference things listed in pages on docs.djangoproject.com
, not on other sites, regardless of who wrote the stuff you found on another site).
comment:3 by , 16 years ago
Replying to ramiro:
(after running python manage.py shell) I got an error.
Please, tell us what the error was; better yet, paste the traceback.
It could be that Postgres is configured to accept conections with the user you are using via TCP on localchost and not via Unix sockets (empty string).
Sorry. Here it is:
Python 2.5.2 (r252:60911, Oct 5 2008, 19:24:49) [GCC 4.3.2] on linux2 Type "help", "copyright", "credits" or "license" for more information. (InteractiveConsole) >>> from django.db import connection >>> cursor = connection.cursor() Traceback (most recent call last): File "<console>", line 1, in <module> File "/var/lib/python-support/python2.5/django/db/backends/__init__.py", line 56, in cursor cursor = self._cursor(settings) File "/var/lib/python-support/python2.5/django/db/backends/postgresql_psycopg2/base.py", line 84, in _cursor self.connection = Database.connect(conn_string, **self.options) OperationalError: FATAL: Ident authentication failed for user "django-user"
Replying to ubernostrum:
This is almost certainly a case of the server expecting a different type of connection; closing invalid because it a) works fine for me and b) references a third-party book (documentation bugs filed here should only reference things listed in pages on
docs.djangoproject.com
, not on other sites, regardless of who wrote the stuff you found on another site).
a) sounds partially reasonable, but b) has no importance. That comment in settings.py is written by Django, not by some third-party book's author.
comment:4 by , 16 years ago
This is an issue with PostgreSQL configuration not Django. However, I also encountered this problem and I found this ticket when I was trying to figure it out. Therefore, I'm posting what I found out for anyone else who ends up here. (Incidentally, I'm also using the Ubuntu package 1.0-1ubuntu1.)
As I understand it, the blank DATABASE_HOST setting uses a unix-domain socket connection, which is also known as a "local" connection in PostgreSQL's pg_hba.conf file. On the other hand, actually specifying 'localhost' for DATABASE_HOST uses a TCP/IP socket, i.e. a "host" connection in pg_hba.conf.
By default, at least on my computer, PostgreSQL is configured to use ident authentication (with the "sameuser" map) for unix-domain socket (local) connections and md5 password authentication for TCP/IP (host) connections from localhost. The latter (ident sameuser) method only works if PostgreSQL database user is the same as the operating system user the connection runs as. In most cases, the PostgresQL database user will be different that the operating system user.
Specifying 'localhost' explicitly works when an empty string doesn't because the former uses a TCP/IP socket and therefore md5 password authentication which will work as long as your database roles are set up correctly.
It's possible to create a usermap so that the ident authentication works, but I found it easier just to enable md5 password authentication for the Django database user. Edit the pg_hba.conf file (on my computer /var/etc/postgresql/8.3/main/pg_hba.conf) by adding the following line (replacing "django-user" with whatever your Django database username is).
local all django-user md5
Put that line after the "TYPE DATABASE USER CIDR-ADDRESS METHOD" heading line but before the default "local all all ident sameuser" line.
This worked for me.
comment:5 by , 16 years ago
Resolution: | invalid |
---|---|
Status: | closed → reopened |
According to moberley and the fact that empty string results a socket connection, instead of localhost connection, comment in "settings.py" should be "# Set to empty string for socket connection." but not "# Set to empty string for localhost.".
comment:6 by , 16 years ago
That change would only confuse things further. Network connections use sockets as well. The current comment is correct. It doesn't say it is the same connection method as putting "localhost" in there. It does say that it will connect to the server on the local host.
A patch to the documentation (databases.txt probably) to point to the right place in the online documentation for each database we support (MySQL and PostgreSQL, in particular) for connection methods would be appropriate. A change to the very short reminder comment in settings.py isn't, since, as your attempt shows, it isn't clearer, nor more understandable.
follow-up: 8 comment:7 by , 16 years ago
Resolution: | → wontfix |
---|---|
Status: | reopened → closed |
Marking wontfix per moberley and Malcolm.
comment:8 by , 15 years ago
Cc: | added |
---|---|
Resolution: | wontfix |
Status: | closed → reopened |
Replying to jacob:
Marking wontfix per moberley and Malcolm.
Sorry by reopening what a commiter closed, but 'localhost' is for me a reminder of network connection to 127.0.0.1
The comment as now with 'localhost' suggests me that something like this occours behind the scenes:
if DATABASE_HOST == '': DATABASE_HOST = 'localhost'
who is simple not true.
What about changing from "Set to empty string for localhost." to "Set to empty string for local host (via file socket)." ?
At least, I ask you to allow a change from 'localhost' to 'local host'.
comment:9 by , 15 years ago
Component: | Uncategorized → Documentation |
---|---|
Triage Stage: | Unreviewed → Accepted |
Marking accepted for the documentation fix that Malcolm suggested.
comment:10 by , 14 years ago
Severity: | → Normal |
---|---|
Type: | → Bug |
comment:11 by , 13 years ago
Easy pickings: | unset |
---|---|
UI/UX: | unset |
I installed fresh recently:
user@userbook:~/Projects/stated$ python -c "import django; print django.VERSION" (1, 3, 0, 'final', 0)
This error is still out there. I almost went mad trying to get postgres working. Until I thought 'maybe the docs are lying'.
comment:13 by , 12 years ago
Has patch: | set |
---|
comment:14 by , 12 years ago
LGTM about content. As for formatting, what about adding a line below NAME stating that "The following settings are not used with sqlite3"?
comment:15 by , 12 years ago
Resolution: | → fixed |
---|---|
Status: | reopened → closed |
Please, tell us what the error was; better yet, paste the traceback.
It could be that Postgres is configured to accept conections with the user you are using via TCP on localchost and not via Unix sockets (empty string).