首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mongo + Postgres + Django测试错误-多个数据库(Django-MongoDB-Engine)

Mongo + Postgres + Django测试错误-多个数据库(Django-MongoDB-Engine)
EN

Stack Overflow用户
提问于 2014-07-18 22:54:35
回答 1查看 982关注 0票数 0

我一直试图让我的django测试为我正在构建的API工作。我是Python的新成员,在这方面我已经坚持了一段时间。

一些快速事实:

  • 我正在使用两个数据库--一个postgresql数据库用于我的用户,一个mongo数据库用于其他所有内容。
  • 我正在使用TastyPie、Django-MongoDB-Engine、Djangotoolbox、Django-Non-rel、Pymongo和psycopg2。
  • 我已经成功地连接到了数据库。当我从shell中保存auth_user时,它保存到sql数据库,模型从我的应用程序保存到mongoDB。

我必须将它与另一个API集成,因此仅限于我对数据库和库的选择。

我最大的问题是测试-我不能让它工作。

当我尝试使用./manage.py e.py测试运行Django的测试时,我总是得到以下错误:

代码语言:javascript
复制
pymongo.errors.OperationFailure: command SON([('authenticate', 1), ('user', u'test'), ('nonce', u'blahblah'), ('key', u'blahblah')]) failed: auth fails

经过广泛的搜索,我仍然不知道是什么。我知道,很明显,有些东西试图使用我的MongoDB进行身份验证,然后它就不允许它了。我不介意使用这个DB来测试,因为它无论如何都是一个测试DB。

请帮帮我!下面是我的配置和错误消息。

I设置数据库设置包括两个数据库,如下所示:

代码语言:javascript
复制
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'main_db',
        'USER': os.environ['RDS_USERNAME'],
        'PASSWORD': os.environ['RDS_PASSWORD'],
        'HOST': os.environ['RDS_HOSTNAME'],
        'PORT': os.environ['RDS_PORT'],
    },
    'mongo': {
        'ENGINE': 'django_mongodb_engine',
        'NAME': 'mongo_db',
        'USER': os.environ['MONGO_USERNAME'],
        'PASSWORD': os.environ['MONGO_PASSWORD'],
        'HOST': os.environ['MONGO_HOSTNAME'],
        'PORT': os.environ['MONGO_PORT'],
    }
}

DATABASE_ROUTERS = ['myproject.database_router.AuthRouter']

,如您所见,我创建了自己的自定义路由器:

代码语言:javascript
复制
sql_databases = ['admin', 'auth', 'contenttypes', 'tastypie'
                 'sessions', 'messages', 'staticfiles']


class AuthRouter(object):
    """
    A router to control all database operations on models in the
    auth application.
    """
    def db_for_read(self, model, **hints):
        """
        Attempts to read auth models go to auth_db.
        """
        if model._meta.app_label in sql_databases:
            return 'default'
        return 'mongo'

    def db_for_write(self, model, **hints):
        """
        Attempts to write auth models go to auth_db.
        """
        if model._meta.app_label in sql_databases:
            return 'default'
        return 'mongo'

    def allow_relation(self, obj1, obj2, **hints):
        """
        Allow relations only if model does includes auth app.
        """
        if obj1._meta.app_label in sql_databases or \
           obj2._meta.app_label in sql_databases:
                return True
        return False

    def allow_migrate(self, db, model):
        """
        Make sure the auth app only appears in the 'auth_db'
        database.
        """
        if db == 'default':
            return model._meta.app_label in sql_databases
        elif model._meta.app_label in sql_databases:
            return False
        return False

完整的跟踪在这里:

代码语言:javascript
复制
Traceback (most recent call last):
File "./manage.py", line 10, in <module>
  execute_from_command_line(sys.argv)
File "myproject/djenv/lib/python2.7/site-packages/django/core/management/__init__.py", line 399, in execute_from_command_line
  utility.execute()
File "myproject/djenv/lib/python2.7/site-packages/django/core/management/__init__.py", line 392, in execute
  self.fetch_command(subcommand).run_from_argv(self.argv)
File "myproject/djenv/lib/python2.7/site-packages/django/core/management/commands/test.py", line 50, in run_from_argv
  super(Command, self).run_from_argv(argv)
File "myproject/djenv/lib/python2.7/site-packages/django/core/management/base.py", line 242, in run_from_argv
  self.execute(*args, **options.__dict__)
File "myproject/djenv/lib/python2.7/site-packages/django/core/management/commands/test.py", line 71, in execute
  super(Command, self).execute(*args, **options)
File "myproject/djenv/lib/python2.7/site-packages/django/core/management/base.py", line 285, in execute
  output = self.handle(*args, **options)
File "myproject/djenv/lib/python2.7/site-packages/django/core/management/commands/test.py", line 88, in handle
  failures = test_runner.run_tests(test_labels)
File "myproject/djenv/lib/python2.7/site-packages/django/test/runner.py", line 145, in run_tests
  old_config = self.setup_databases()
File "myproject/djenv/lib/python2.7/site-packages/django/test/runner.py", line 107, in setup_databases
  return setup_databases(self.verbosity, self.interactive, **kwargs)
File "myproject/djenv/lib/python2.7/site-packages/django/test/runner.py", line 279, in setup_databases
  verbosity, autoclobber=not interactive)
File "myproject/djenv/lib/python2.7/site-packages/django_mongodb_engine/creation.py", line 196, in create_test_db
  self.connection._reconnect()
File "myproject/djenv/lib/python2.7/site-packages/django_mongodb_engine/base.py", line 279, in _reconnect
  self._connect()
File "myproject/djenv/lib/python2.7/site-packages/django_mongodb_engine/base.py", line 268, in _connect
  if not self.database.authenticate(user, password):
File "myproject/djenv/lib/python2.7/site-packages/pymongo/database.py", line 891, in authenticate
  self.connection._cache_credentials(self.name, credentials)
File "myproject/djenv/lib/python2.7/site-packages/pymongo/mongo_client.py", line 459, in _cache_credentials
  auth.authenticate(credentials, sock_info, self.__simple_command)
File "myproject/djenv/lib/python2.7/site-packages/pymongo/auth.py", line 243, in authenticate
  auth_func(credentials[1:], sock_info, cmd_func)
File "myproject/djenv/lib/python2.7/site-packages/pymongo/auth.py", line 222, in _authenticate_mongo_cr
  cmd_func(sock_info, source, query)
File "myproject/djenv/lib/python2.7/site-packages/pymongo/mongo_client.py", line 690, in __simple_command
  helpers._check_command_response(response, None, msg)
File "myproject/djenv/lib/python2.7/site-packages/pymongo/helpers.py", line 178, in _check_command_response
  raise OperationFailure(msg % errmsg, code, response)
pymongo.errors.OperationFailure: command SON([('authenticate', 1), ('user', u'test'), ('nonce', u'blahblah'), ('key', u'blahblah')]) failed: auth fails

任何帮助都是非常感谢的!

EN

回答 1

Stack Overflow用户

发布于 2014-08-19 17:54:24

想要更新一下我是如何解决这个问题的--我以为这是一个读/写问题(带有auth失败问题),但事实并非如此。

  1. 如果您看到此错误,这是一个身份验证问题--您的用户名、密码、数据库名或集合名都不正确。 pymongo.errors.OperationFailure:命令子((‘认证’,1),(‘用户’,u‘测试’),('nonce',u‘’blahblah‘),('key',u’‘blahblah’)失败: auth失败
  2. 在设置测试数据库时,Django将“test_”添加到数据库名称的开头。因此,我的主数据库,称为maindb,然后被创建为'test_maindb‘。 您可以在以下网站看到有关此方面的信息:测试数据库和Django
  3. 确保您可以将名称命名为“test_”的单独数据库写入该名称。 另外-另一种解决方案是在数据库设置中定义测试数据库设置。这可以通过在任何数据库属性中添加“TEST_”来实现。以下是一个例子: 数据库={ 'default':{ 'ENGINE':‘django.db.backends.postgresql_piccopg2’,'NAME':'maindb','USER':os.environ‘’RDS_USERNAME‘,'PASSWORD':os.environ’‘RDS_PASSWORD’,'HOST':os.environ‘’RDS_HOSTNAME‘,'PORT':os.environ’‘RDS_PORT’,'TEST_NAME':'my_test_sql','TEST_USER':'test_sql_user','TEST_PASSWORD':'password‘},'mongo':{ 'ENGINE':'django_mongodb_engine','NAME':'mongodb','USER':os.environ’mongodb‘,'PASSWORD':os.environ‘mongo’,'HOST':os.environ‘mongo’,'PORT':os.environ‘mongo’,'TEST_NAME':'my_test_mongodb','TEST_USER':'test_mongo_user','TEST_PASSWORD':'password‘}}

希望能帮上忙!如果你看到更多的东西,请提供反馈。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24834927

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档