Получение ошибки ReplicaSetNoPrimary для кластера M0 при использовании Django с MongoEngine

Я использую django с mongoengine. В файле settings.py я пишу следующее:

from mongoengine import connect
URI = 'mongodb+srv://myusername:mypassword@cluster0.5apjp.mongodb.net/django?retryWrites=true&w=majority&ssl=false'
connect(host=URI)

После этого у меня получилась следующая модель:

from mongoengine import Document, StringField
class User(Document):
    first_name = StringField(max_length=50)
    last_name = StringField(max_length=50)

    meta = {
        'collection': 'users'
    }

У меня есть следующий вид:

def adduser(request):
    userDict = json.loads(request.body)
    newUser = User(first_name=userDict['firstName'],last_name=userDict['lastName'])
    newUser.save()
    return HttpResponse('user added')

При вызове этой функции просмотра я получаю ошибку следующего вида:

ServerSelectionTimeoutError(
pymongo.errors.ServerSelectionTimeoutError: cluster0-shard-00-02.5apjp.mongodb.net:27017: 
connection closed (configured timeouts: socketTimeoutMS: 20000.0ms, connectTimeoutMS: 
20000.0ms),cluster0-shard-00-01.5apjp.mongodb.net:27017: connection closed (configured timeouts:
 socketTimeoutMS: 20000.0ms, connectTimeoutMS: 20000.0ms),cluster0-shard-00-00.5apjp.mongodb.net:27017: 
connection closed (configured timeouts: socketTimeoutMS: 20000.0ms, connectTimeoutMS: 20000.0ms),
 Timeout: 30s, Topology Description: <TopologyDescription id: 65c3bdc13c9136a1191890e1, 
topology_type: ReplicaSetNoPrimary, servers: [<ServerDescription ('cluster0-shard-00-00.5apjp.mongodb.net', 27017) 
server_type: Unknown, rtt: None, error=AutoReconnect('cluster0-shard-00-00.5apjp.mongodb.net:27017: 
connection closed (configured timeouts: socketTimeoutMS: 20000.0ms, connectTimeoutMS: 20000.0ms)')>, 
<ServerDescription ('cluster0-shard-00-01.5apjp.mongodb.net', 27017) 
server_type: Unknown, rtt: None, error=AutoReconnect('cluster0-shard-00-01.5apjp.mongodb.net:27017: 
connection closed (configured timeouts: socketTimeoutMS: 20000.0ms, connectTimeoutMS: 20000.0ms)')>, 
<ServerDescription ('cluster0-shard-00-02.5apjp.mongodb.net', 27017) 
server_type: Unknown, rtt: None, error=AutoReconnect('cluster0-shard-00-02.5apjp.mongodb.net:27017: 
connection closed (configured timeouts: socketTimeoutMS: 20000.0ms, 
connectTimeoutMS: 20000.0ms)')>]>
[07/Feb/2024 23:02:38] "POST /user/adduser HTTP/1.1" 500 115166

Я использую кластер mongodb free M0 с базой данных под названием 'django' и коллекцией под названием 'users'.

Если я использую не SRV URI, например localhost:27017, все работает нормально. Но когда я использую SRV URI, он выдает эту ошибку.

Более того, я добавил 0.0.0.0/0 в список IP-доступа на вкладке Network Access в MongoDB Atlas UI.

Пожалуйста, помогите мне избавиться от этой ошибки, чтобы я мог приступить к основным CRUD-операциям над MongoDB, используя Django с MongoEngine.

Серверу MongoDB Atlas требуется, чтобы все клиентские соединения использовали SSL/TLS.

Протокол mongodb+srv неявно включает TLS.

Помещение ssl=false в строку подключения переопределяет неявное значение по умолчанию, что приводит к попытке подключения без использования SSL/TLS.

Поскольку незашифрованные соединения не разрешены, сервер немедленно закрывает соединение без ответа, что очень похоже на сетевую ошибку после подключения.

Удалите ssl=false из строки соединения для подключения.

Конечно, мне нужно удалить ssl=false. Но это не решило мою проблему. После этого я получал ошибку SSL-сертификата. Из сообщества разработчиков MongoDB я узнал, что системные сертификаты моей ОС устарели и нуждаются в обновлении. Их можно обновить или отменить с помощью команды certifi следующим образом:

python -m pip install --upgrade certifi

А затем в моем файле settings.py,

import certifi
from mongoengine import connect
URI = 'mongodb+srv://...'
connect(host=URI, tlsCAFile=certifi.where())
Вернуться на верх