Django не могу подключиться к атласу mongoDB - PullRequest
0 голосов
/ 21 февраля 2020

Недавно я начал проект по созданию веб-сервера с использованием Django бэкэнда и базы данных mongoDB, размещенной на их платформе Atlas, поэтому мне не нужно беспокоиться о его локальном запуске.

Я все еще на начальных этапах настройки и столкнулся с этой ошибкой:

pymongo.errors.ServerSelectionTimeoutError: localhost:27017: [WinError 10061] No connection could be made because the target machine actively refused it

Также может быть уместно упомянуть, что в настоящее время у меня нет документов для базы данных или моделей в виде Django приложений, но я сомневаюсь, что это проблема, так как при запуске manage.py migrate я получаю вышеуказанную ошибку, а не ошибку «нет приложения с меткой».

Моя конфигурация базы данных в моем файле settings.py в настоящее время выглядит следующим образом:

DATABASES = {
    'default': {
        'ENGINE': 'djongo',
        'NAME': 'house-project',
        'HOST': 'mongodb+srv://<my-user-name>:<my-password>@house-project-9g5fo.gcp.mongodb.net/test?retryWrites=true&w=majority'
    }
}

Я знаю, что одной из распространенных ошибок является наличие специальных символов в вашем пароле и имени пользователя, я старался не включать какие-либо или избегайте их с помощью шестнадцатеричных символов. Я удостоверился, что добавил свой ip и пользователя на стороне Атласа. Я проверил онлайн на интересный ответ, но безрезультатно. Ближайший вопрос, который я нашел, был: Как подключить Django ORM к понедельнику go атлас? , но это решение не работает для меня, к сожалению.

Любая помощь будет полезна в пытаясь решить эту проблему, дайте мне знать, если потребуется дополнительная информация о моей настройке, дайте мне знать, и я был бы рад предоставить ее. Я также включил трассировку стека на случай, если она уместна ниже.

Traceback (most recent call last):
  File "manage.py", line 20, in <module>
    main()
  File "manage.py", line 16, in main
    execute_from_command_line(sys.argv)
  File "C:\Users\mkars\.virtualenvs\house-project-VuTUb3qx\lib\site-packages\django\core\management\__init__.py", line 381, in execute_from_command_line
    utility.execute()
  File "C:\Users\mkars\.virtualenvs\house-project-VuTUb3qx\lib\site-packages\django\core\management\__init__.py", line 375, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "C:\Users\mkars\.virtualenvs\house-project-VuTUb3qx\lib\site-packages\django\core\management\base.py", line 323, in run_from_argv
    self.execute(*args, **cmd_options)
  File "C:\Users\mkars\.virtualenvs\house-project-VuTUb3qx\lib\site-packages\django\core\management\base.py", line 364, in execute
    output = self.handle(*args, **options)
  File "C:\Users\mkars\.virtualenvs\house-project-VuTUb3qx\lib\site-packages\django\core\management\base.py", line 83, in wrapped
    res = handle_func(*args, **kwargs)
  File "C:\Users\mkars\.virtualenvs\house-project-VuTUb3qx\lib\site-packages\django\core\management\commands\migrate.py", line 87, in handle
    executor = MigrationExecutor(connection, self.migration_progress_callback)
  File "C:\Users\mkars\.virtualenvs\house-project-VuTUb3qx\lib\site-packages\django\db\migrations\executor.py", line 18, in __init__
    self.loader = MigrationLoader(self.connection)
  File "C:\Users\mkars\.virtualenvs\house-project-VuTUb3qx\lib\site-packages\django\db\migrations\loader.py", line 49, in __init__
    self.build_graph()
  File "C:\Users\mkars\.virtualenvs\house-project-VuTUb3qx\lib\site-packages\django\db\migrations\loader.py", line 212, in build_graph
    self.applied_migrations = recorder.applied_migrations()
  File "C:\Users\mkars\.virtualenvs\house-project-VuTUb3qx\lib\site-packages\django\db\migrations\recorder.py", line 73, in applied_migrations
    if self.has_table():
  File "C:\Users\mkars\.virtualenvs\house-project-VuTUb3qx\lib\site-packages\django\db\migrations\recorder.py", line 56, in has_table
    return self.Migration._meta.db_table in self.connection.introspection.table_names(self.connection.cursor())
  File "C:\Users\mkars\.virtualenvs\house-project-VuTUb3qx\lib\site-packages\django\db\backends\base\introspection.py", line 48, in table_names
    return get_names(cursor)
  File "C:\Users\mkars\.virtualenvs\house-project-VuTUb3qx\lib\site-packages\django\db\backends\base\introspection.py", line 43, in get_names
    return sorted(ti.name for ti in self.get_table_list(cursor)
  File "C:\Users\mkars\.virtualenvs\house-project-VuTUb3qx\lib\site-packages\djongo\introspection.py", line 47, in get_table_list
    for c in cursor.db_conn.list_collection_names()
  File "C:\Users\mkars\.virtualenvs\house-project-VuTUb3qx\lib\site-packages\pymongo\database.py", line 856, in list_collection_names
    for result in self.list_collections(session=session, **kwargs)]
  File "C:\Users\mkars\.virtualenvs\house-project-VuTUb3qx\lib\site-packages\pymongo\database.py", line 818, in list_collections
    return self.__client._retryable_read(
  File "C:\Users\mkars\.virtualenvs\house-project-VuTUb3qx\lib\site-packages\pymongo\mongo_client.py", line 1453, in _retryable_read
    server = self._select_server(
  File "C:\Users\mkars\.virtualenvs\house-project-VuTUb3qx\lib\site-packages\pymongo\mongo_client.py", line 1253, in _select_server
    server = topology.select_server(server_selector)
  File "C:\Users\mkars\.virtualenvs\house-project-VuTUb3qx\lib\site-packages\pymongo\topology.py", line 233, in select_server
    return random.choice(self.select_servers(selector,
  File "C:\Users\mkars\.virtualenvs\house-project-VuTUb3qx\lib\site-packages\pymongo\topology.py", line 192, in select_servers
    server_descriptions = self._select_servers_loop(
  File "C:\Users\mkars\.virtualenvs\house-project-VuTUb3qx\lib\site-packages\pymongo\topology.py", line 208, in _select_servers_loop
    raise ServerSelectionTimeoutError(
pymongo.errors.ServerSelectionTimeoutError: localhost:27017: [WinError 10061] No connection could be made because the target machine actively refused it```

Ответы [ 3 ]

1 голос
/ 25 февраля 2020

Документация Djon go неверна или устарела. Мне удалось заставить мое приложение Django подключаться к mongodb с использованием следующих настроек:

DATABASES = {
    'default': {
        'ENGINE': 'djongo',
        'CLIENT': {
            'host': 'mongodb+srv://<URL>',
            'username': 'something',
            'password': 'somepass',
            'authMechanism': 'SCRAM-SHA-1'
        }
    }
}
0 голосов
/ 22 февраля 2020

Та же проблема. Это действительно очень хакерский способ изменить настройки библиотеки для достижения желаемых результатов. Проблема может быть вызвана двумя причинами: либо движком Djon go (скорее всего), который не передает указанный HOST в конструктор pymon go mongo_client.py. Другим источником может быть Django, который неправильно называет конструктор (маловероятно). Я хочу развернуть свой проект в Heroku, но это невозможно, поскольку все устанавливаемые мной зависимости будут иметь эту ошибку, и я не могу изменить имя HOST вручную.

0 голосов
/ 21 февраля 2020

Я нашел очень хакерское решение. Jayadevan был прав: pymon go пытался подключиться к моему локальному хосту вместо предоставленного URI, несмотря на то, что я указал хост.

Я искал, почему это может быть, и наткнулся на эту проблему с github. В этом потоке была предложена смена хоста в mongo_client.py. Этот файл находится в вашем каталоге, в котором находятся ваши файлы зависимостей.

Изменение HOST в этом файле позволяет моей базе данных подключаться. Это приводит меня к убеждению, что pymon go не учитывает указанный вами HOST.

Если кто-то знает, что я пропустил, или способ, которым я могу исправить свои текущие настройки, чтобы я не нужно использовать этот обходной путь, пожалуйста, дайте мне знать.

...