Mac OS X上的Django:OperationalError'角色“_www”不存在'。 PostgreSQL或Psycopg问题?

时间:2013-02-13 20:06:44

标签: django apache mod-wsgi psycopg2 postgresql-9.2

我是Django的网络开发新手,所以请耐心等待,并提前感谢您的帮助。

在学习的过程中,我一直在使用Django自己的Web服务器和SQLite。但是,现在我正在努力为我的下一个项目设置一个更复杂的设置。

我的设置(Apache,Python,mod_wsgi,PostgreSQL服务器,psycopg和Django)应该尽我所能地工作。我创建了我的Django项目,并在我的浏览器上访问了localhost,在那里我得到了“欢迎来到Django!它工作了!”页。但是,当我尝试启用管理员并访问localhost / admin /时出现以下错误(请注意,我可以使用Django自己的Web服务器访问此页面而不会出错):

OperationalError at /admin/
FATAL: Role "_www" does not exist
Request Method: GET
Request URL: http://localhost/admin/
Django Version: 1.4.3
Exception Type: OperationalError
Exception Value: FATAL:  role "_www" does not exist
Exception Location: /Library/Python/2.7/site-packages/psycopg2/__init__.py in connect, line 178

我猜测PostgreSQL或psycopg有些不对劲,但我不确定究竟是什么。这就是我到达这里的方式:

  1. Mac OS X Mountain Lion(10.8.2)全新安装。
  2. 从Mac App Store安装Xcode,然后从Xcode的首选项中安装命令行工具。
  3. 没有更新Apache或Python,我正在使用默认安装的任何东西(Apache 2.2.22和Python 2.7.2)。
  4. 从源

    安装mod_wsgi 3.4
    $ curl -O http://modwsgi.googlecode.com/files/mod_wsgi-3.4.tar.gz
    $ tar xvfz mod_wsgi-3.4.tar.gz
    $ cd mod_wsgi-3.4
    $ ./configure
    $ make
    

    (注意:我必须输入以下行才能使“make”起作用:)

    $ sudo ln -s /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/ /Applications/Xcode.app/Contents/Developer/Toolchains/OSX10.8.xctoolchain
    $ make install
    
  5. 编辑了httpd.conf,添加了以下内容并重新启动了Apache:

    LoadModule wsgi_module libexec/apache2/mod_wsgi.so
    
  6. 通过下载Postgres.app(http://postgresapp.com)安装PostgreSQL 9.2.2并将其复制到我的Applications文件夹。
  7. 运行应用程序,将以下内容添加到我的〜/ .bash_profile中(默认情况下,终端使用Postgres.app的psql,而不是预装在Mac OS X上的那个),然后创建一个新的我的django项目使用的数据库:

    PATH="/Applications/Postgres.app/Contents/MacOS/bin:$PATH"
    
  8. 从源代码安装psycopg 2.4.6。我下载了文件,将其解压缩,然后从解压缩目录中删除:

    $ python setup.py install
    
  9. 从源代码安装Django 1.4.3。创建了一个新项目和一个新应用程序。编辑settings.py以取消注释管理应用程序并输入我的数据库设置(如Postgres.app网站上所述:http://postgresapp.com/documentation#toc_3)。数据库设置如下所示:

    DATABASES = {
        'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'my_db_name',
        'USER': '',
        'PASSWORD': '',
        'HOST': '',
        'PORT': '',
        }
    }
    
  10. 编辑urls.py以取消注释与管理员相关的行:

    from django.conf.urls import patterns, include, url
    
    from django.contrib import admin
    admin.autodiscover()
    
    urlpatterns = patterns('',
        url(r'^admin/', include(admin.site.urls)),
    )
    
  11. 在https.conf末尾添加了以下文字:

    WSGIScriptAlias / /Users/antubel/Projects/Django/antubel_com/antubel_com/wsgi.py
    WSGIPythonPath /Users/antubel/Projects/Django/antubel_com
    
    <Directory /Users/antubel/Projects/Django/antubel_com>
        <Files wsgi.py>
            Order deny,allow
            Allow from all
        </Files>
    </Directory>
    
  12. 重启Apache。试图在我的浏览器上加载localhost / admin /并得到上面提到的错误。

  13. 请帮助:)

    谢谢, Dasuevia

1 个答案:

答案 0 :(得分:3)

由于您的设置文件未指定用户连接到Postgres,您尝试使用运行代码的用户帐户进行连接(并且因为它在Apache下由mod_wsgi运行,因此该用户为{{1 }})。

如果您使用Postgres.app为您运行Postgres,则需要将数据库_www值设置为系统帐户的用户名 - 因此,如果您的用户名为USERNAME ,将foo设置为USERNAME,如下所示:

foo

您还可以更新您的apache配置,以便以不同的用户身份运行您的代码 - 如果您想要改变它,请查看mod_wsgi文档中的WSGIDaemonProcess