Получение ошибки 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())