Django管理站点无法连接数据库 - 使用错误的MongoDB引擎

3 投票
2 回答
2022 浏览
提问于 2025-04-16 21:28

我之前已经让我的Django应用的管理网站正常工作过,但现在我就是找不到问题出在哪里。

settings.py文件里,我有MongoDB数据库的配置:

DATABASES = {
    'default': {
        'ENGINE': 'django_mongodb_engine', 
        'NAME': 'myapp', 
        'USER': 'username',
        'PASSWORD': '********'
        'HOST': 'myserver.com',          
        'PORT': '27157',
        'SUPPORTS_TRANSACTIONS': False,
    }
}

我知道这些设置是正确的,因为我已经有一些视图可以从数据库读取信息并显示出来。所以我确定我的应用可以连接到MongoDB数据库。

我已经配置了urls.py、admin.py和settings.py来启用管理网站(之前也确实能正常工作过)。但是现在当我尝试访问时,只看到:

Traceback:
File "/usr/local/lib/python2.6/dist-packages/django/core/handlers/base.py" in get_response
  111.                         response = callback(request, *callback_args, **callback_kwargs)
File "/usr/local/lib/python2.6/dist-packages/django/contrib/admin/sites.py" in wrapper
  214.                 return self.admin_view(view, cacheable)(*args, **kwargs)
File "/usr/local/lib/python2.6/dist-packages/django/utils/decorators.py" in _wrapped_view
  93.                     response = view_func(request, *args, **kwargs)
File "/usr/local/lib/python2.6/dist-packages/django/views/decorators/cache.py" in _wrapped_view_func
  79.         response = view_func(request, *args, **kwargs)
File "/usr/local/lib/python2.6/dist-packages/django/contrib/admin/sites.py" in inner
  195.             if not self.has_permission(request):
File "/usr/local/lib/python2.6/dist-packages/django/contrib/admin/sites.py" in has_permission
  148.         return request.user.is_active and request.user.is_staff
File "/usr/local/lib/python2.6/dist-packages/django/contrib/auth/middleware.py" in __get__
  9.             request._cached_user = get_user(request)
File "/usr/local/lib/python2.6/dist-packages/django/contrib/auth/__init__.py" in get_user
  107.         user_id = request.session[SESSION_KEY]
File "/usr/local/lib/python2.6/dist-packages/django/contrib/sessions/backends/base.py" in __getitem__
  47.         return self._session[key]
File "/usr/local/lib/python2.6/dist-packages/django/contrib/sessions/backends/base.py" in _get_session
  195.                 self._session_cache = self.load()
File "/usr/local/lib/python2.6/dist-packages/mongoengine/django/sessions.py" in load
  26.             s = MongoSession.objects(session_key=self.session_key,
File "/usr/local/lib/python2.6/dist-packages/mongoengine/queryset.py" in __get__
  1151.         db = _get_db()
File "/usr/local/lib/python2.6/dist-packages/mongoengine/connection.py" in _get_db
  41.         _connection[identity] = _get_connection(reconnect=reconnect)
File "/usr/local/lib/python2.6/dist-packages/mongoengine/connection.py" in _get_connection
  33.             raise ConnectionError('Cannot connect to the database')

Exception Type: ConnectionError at /admin/
Exception Value: Cannot connect to the database

我在mongoengine/connection.py里加入了一些调试信息,可以看到用来连接数据库的连接设置是:

{'host': 'localhost', 'port': 27017}

这意味着它使用的是默认的连接设置,而不是我在settings.py里提供的设置。你觉得这可能是什么原因呢?为什么数据库的设置没有传递到管理网站?也许我在管理配置中忘记做了什么?

编辑:
我按照这些说明配置了我的Django应用以便与MongoDB数据库一起使用。我使用的是djangotoolboxdjango-nonrel

刚才我意识到,当我设置'ENGINE': 'django_mongodb_engine'时,应该使用的MongoDB引擎是django-mongodb-engine,而不是mongoengine。但在错误追踪中我看到它正在使用mongoengine。(django-mongodb-engine并不依赖于mongoengine)我猜测在视图中使用的是正确的引擎(所以才有效),但管理网站却出于某种原因在使用mongoengine?如果我理解正确,我的应用其实根本不需要mongoengine才能工作。它只是因为我之前在尝试的时候安装的。

2 个回答

0

mongoengine和Django-admin不兼容,这是因为Django-admin模块内部使用了连接查询。你可以尝试使用一个不需要关系型数据库的Django版本,比如django-non-rel。不过,django-non-rel已经不再跟最新的Django版本保持同步了。

可以看看这个 问题。还有一个新的django包,它支持将Django-admin模块连接到MongoDB,并且允许你在Django模型中使用嵌入文档。

1

我找到问题了,特地把它写在这里,以便结束这个问题。

我在我的settings.py文件里有一行代码SESSION_ENGINE = 'mongoengine.django.sessions'(这是因为我不小心复制粘贴的结果),这导致我的应用程序使用了mongoengine,而不是django-mongodb-engine

撰写回答