簡體   English   中英

Django 無法連接到 mongoDB 圖集

[英]Django cant connect to mongoDB atlas

最近我開始了一個項目,使用 Django 后端和一個托管在他們的 Atlas 平台上的 mongoDB 數據庫來制作一個 Web 服務器,所以我不必擔心在本地運行它。

我還處於設置的早期階段,遇到了這個錯誤:

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'
    }
}

我知道常見錯誤之一是您的密碼和用戶名中包含特殊字符,我已確保不包含任何字符或使用十六進制字符轉義它們。 我已確保在 Atlas 端添加我的 ip 和用戶。 我在網上查了一個現有的答案,無濟於事。 我發現的最接近的問題是: 如何將 Django ORM 連接到 mongo atlas? ,但遺憾的是,此解決方案對我不起作用。

任何幫助都有助於解決此問題,如果需要有關我的設置的任何其他信息,請告訴我,我很樂意提供。 我還包括了一個堆棧跟蹤,以防它在下面相關。

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```

Djongo 文檔不正確或過時。 我能夠使用以下設置讓我的 Django 應用程序連接到 mongodb:

DATABASES = {
    'default': {
        'ENGINE': 'djongo',
        'CLIENT': {
            'host': 'mongodb+srv://<URL>',
            'username': 'something',
            'password': 'somepass',
            'authMechanism': 'SCRAM-SHA-1'
        }
    }
}

我找到了一個非常hack-y的解決方案。 Jayadevan 是正確的,盡管我指定了主機,pymongo 還是試圖連接到我的本地主機而不是提供的 URI。

我一直在尋找為什么會這樣,我偶然發現了這個github 問題。 在這個線程中有一個 sugestion 來更改 mongo_client.py 中的主機。 這個文件可以在你的依賴文件所在的目錄中找到。

更改此文件中的 HOST 確實允許我的數據庫連接。 這讓我相信 pymongo 不會考慮您指定的 HOST。

如果有人知道我錯過了什么,或者我可以修復當前設置以便我不必使用此解決方法的方法,請告訴我。

同樣的問題。 這確實是一種非常hacky的方式來修改庫設置以達到預期的結果。 問題可能源於兩個地方:要么來自 Djongo 引擎(最有可能),它沒有將指定的 HOST 轉發到 pymongo 的 mongo_client.py 構造函數。 另一個來源可能是 Django 本身,它沒有以正確的方式調用構造函數(不太可能)。 我想將我的項目部署到 Heroku,但這是不可能的,因為我安裝的所有依賴項都會有這個錯誤,而且我無法手動更改 HOST 名稱。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM