在django-digest的数据库后端出现KeyError

1 投票
1 回答
1993 浏览
提问于 2025-04-15 23:52

我刚开始把django_digest这个库整合到我的应用中。作为第一步,我在我的一个视图上加了@httpdigest这个装饰器。 但是当我尝试连接时,出现了一个KeyError错误,这个错误是在django_digest/backend/db.py文件里抛出的。根据我配置的数据库不同,错误的位置也会不同。我使用的是Django 1.2.1,数据库是MySql(也测试过sqlite)。 我对所有设置选项都用了默认值。

从我能看到的情况来看,我按照所有说明操作了,但今天一直在为这个问题苦恼。我使用的是django-digest和python-digest的仓库版本。任何指点都会非常感激。

下面是sqlite和mysql的错误追踪信息:

使用sqlite时:

Traceback (most recent call last):
  File "/home/robm/projects/gcs/server/gcs2.5/lib/python2.5/site-packages/django/core/servers/basehttp.py", line 674, in __call__
    return self.application(environ, start_response)
  File "/home/robm/projects/gcs/server/gcs2.5/lib/python2.5/site-packages/django/core/handlers/wsgi.py", line 248, in __call__
    signals.request_finished.send(sender=self.__class__)
  File "/home/robm/projects/gcs/server/gcs2.5/lib/python2.5/site-packages/django/dispatch/dispatcher.py", line 162, in send
    response = receiver(signal=self, sender=sender, **named)
  File "/home/robm/projects/gcs/server/gcs2.5/lib/python2.5/site-packages/django_digest-1.8-py2.5.egg/django_digest/backend/db.py", line 16, in close_connection
    _connection.close()
  File "/home/robm/projects/gcs/server/gcs2.5/lib/python2.5/site-packages/django/db/backends/sqlite3/base.py", line 186, in close
    if self.settings_dict['NAME'] != ":memory:":
KeyError: 'NAME'

使用mysql时:

Traceback (most recent call last):
  File "/home/robm/projects/gcs/server/gcs2.5/lib/python2.5/site-packages/django/core/servers/basehttp.py", line 674, in __call__
    return self.application(environ, start_response)
  File "/home/robm/projects/gcs/server/gcs2.5/lib/python2.5/site-packages/django/core/handlers/wsgi.py", line 241, in __call__
    response = self.get_response(request)
  File "/home/robm/projects/gcs/server/gcs2.5/lib/python2.5/site-packages/django/core/handlers/base.py", line 142, in get_response
    return self.handle_uncaught_exception(request, resolver, exc_info)
  File "/home/robm/projects/gcs/server/gcs2.5/lib/python2.5/site-packages/django/core/handlers/base.py", line 166, in handle_uncaught_exception
    return debug.technical_500_response(request, *exc_info)
  File "/home/robm/projects/gcs/server/gcs2.5/lib/python2.5/site-packages/django/core/handlers/base.py", line 80, in get_response
    response = middleware_method(request)
  File "/home/robm/projects/gcs/server/gcs2.5/lib/python2.5/site-packages/django_digest-1.8-py2.5.egg/django_digest/middleware.py", line 13, in process_request
    if (not self._authenticator.authenticate(request) and
  File "/home/robm/projects/gcs/server/gcs2.5/lib/python2.5/site-packages/django_digest-1.8-py2.5.egg/django_digest/__init__.py", line 86, in authenticate
    partial_digest = self._account_storage.get_partial_digest(digest_response.username)
  File "/home/robm/projects/gcs/server/gcs2.5/lib/python2.5/site-packages/django_digest-1.8-py2.5.egg/django_digest/backend/db.py", line 97, in get_partial_digest
    cursor = get_connection().cursor()
  File "/home/robm/projects/gcs/server/gcs2.5/lib/python2.5/site-packages/django/db/backends/__init__.py", line 75, in cursor
    cursor = self._cursor()
  File "/home/robm/projects/gcs/server/gcs2.5/lib/python2.5/site-packages/django/db/backends/mysql/base.py", line 281, in _cursor
    if settings_dict['USER']:
KeyError: 'USER'

更新 - 看起来这个问题是特定于Django 1.2和多数据库后端的。要解决这个问题,可以把django_digest的backend/db.py中的数据库包装器从:

_connection = backend.DatabaseWrapper({                                          
        'DATABASE_HOST': settings.DATABASE_HOST,                                 
        'DATABASE_NAME': settings.DATABASE_NAME,                                 
        'DATABASE_OPTIONS': settings.DATABASE_OPTIONS,                           
        'DATABASE_PASSWORD': settings.DATABASE_PASSWORD,                         
        'DATABASE_PORT': settings.DATABASE_PORT,                                 
        'DATABASE_USER': settings.DATABASE_USER,                                 
        'TIME_ZONE': settings.TIME_ZONE,                                         
        })                                                                       

改成类似这样的:

_connection = backend.DatabaseWrapper({
                'HOST': settings.DATABASE_HOST,
                'NAME': settings.DATABASE_NAME,
                'OPTIONS': settings.DATABASE_OPTIONS,
                'PASSWORD': settings.DATABASE_PASSWORD,
                'PORT': settings.DATABASE_PORT,
                'USER': settings.DATABASE_USER,
                'TIME_ZONE': settings.TIME_ZONE,
                })

应该就能修复了。

目前我改用HTTPS的HTTPBasicAuth了,但希望下周能有机会做个补丁。

相关问题:

1 个回答

0

为了让这个问题显示为已回答,我把我之前在评论中提到的解决方案加到这里作为答案(这样做对吗?):

看起来这个问题是特定于Django 1.2版本和多数据库的情况。你需要把django_digest的backend/db.py文件中的数据库包装器从:

_connection = backend.DatabaseWrapper({                                          
    'DATABASE_HOST': settings.DATABASE_HOST,                                 
    'DATABASE_NAME': settings.DATABASE_NAME,                                 
    'DATABASE_OPTIONS': settings.DATABASE_OPTIONS,                           
    'DATABASE_PASSWORD': settings.DATABASE_PASSWORD,                         
    'DATABASE_PORT': settings.DATABASE_PORT,                                 
    'DATABASE_USER': settings.DATABASE_USER,                                 
    'TIME_ZONE': settings.TIME_ZONE,                                         
    })         

改成类似这样的:

_connection = backend.DatabaseWrapper({
            'HOST': settings.DATABASE_HOST,
            'NAME': settings.DATABASE_NAME,
            'OPTIONS': settings.DATABASE_OPTIONS,
            'PASSWORD': settings.DATABASE_PASSWORD,
            'PORT': settings.DATABASE_PORT,
            'USER': settings.DATABASE_USER,
            'TIME_ZONE': settings.TIME_ZONE,
            })

这样应该就能解决问题了。

撰写回答