python - example - ¿Por qué PyMongo 3 le da a ServerSelectionTimeoutError?
pymongo no default database defined (10)
Encontré el mismo problema y, finalmente, encontré que la IP del cliente está bloqueada por el servidor de seguridad del servidor mongo.
Estoy usando:
- Python 3.4.2
- PyMongo 3.0.2
- mongolab corriendo mongod 2.6.9
- uWSGI 2.0.10
- CherryPy 3.7.0
- nginx 1.6.2
uWSGI start params:
--socket 127.0.0.1:8081 --daemonize --enable-threads --threads 2 --processes 2
Configuré mi MongoClient UNA vez:
self.mongo_client = MongoClient(''mongodb://user:[email protected]:port/mydb'')
self.db = self.mongo_client[''mydb'']
Intento guardar un dictado JSON en MongoDB:
result = self.db.jobs.insert_one(job_dict)
Funciona a través de una prueba de unidad que ejecuta la misma ruta de código a mongodb. Sin embargo, cuando ejecuto a través de CherryPy y uWSGI usando un HTTP POST, obtengo esto:
pymongo.errors.ServerSelectionTimeoutError: No servers found yet
¿Por qué veo este comportamiento cuando se ejecuta a través de CherryPy y uWSGI? ¿Es este quizás el nuevo modelo de hilo en PyMongo 3?
Actualizar:
Si ejecuto sin uWSGI y nginx utilizando el servidor incorporado de CherryPy, el insert_one()
funciona.
Actualización 1/25 4:53 pm EST:
Después de agregar un poco de depuración en PyMongo, parece que topology._update_servers()
sabe que server_type = 2 para el servidor ''myserver-a.mongolab.com''. Sin embargo, server_description.known_servers()
tiene server_type = 0 para el servidor ''myserver.mongolab.com''
Esto conduce a la siguiente traza de pila:
result = self.db.jobs.insert_one(job_dict)
File "/usr/local/lib/python3.4/site-packages/pymongo/collection.py", line 466, in insert_one
with self._socket_for_writes() as sock_info:
File "/usr/local/lib/python3.4/contextlib.py", line 59, in __enter__
return next(self.gen)
File "/usr/local/lib/python3.4/site-packages/pymongo/mongo_client.py", line 663, in _get_socket
server = self._get_topology().select_server(selector)
File "/usr/local/lib/python3.4/site-packages/pymongo/topology.py", line 121, in select_server
address))
File "/usr/local/lib/python3.4/site-packages/pymongo/topology.py", line 97, in select_servers
self._error_message(selector))
pymongo.errors.ServerSelectionTimeoutError: No servers found yet
Estamos investigando este problema, rastreado en PYTHON-961 . Es posible que pueda solucionar el problema al pasar connect = False al crear instancias de MongoClient. Eso difiere la conexión en segundo plano hasta que se intenta la primera operación de la base de datos, evitando lo que sospecho que es una condición de carrera entre la rotación del subproceso del monitor de MongoClient y la bifurcación de multiproceso.
Esto se ha solucionado en PyMongo
con this pull_request.
Lo arreglé para mí mismo bajando de pymongo 3.0 a 2.8. No tengo idea de lo que está pasando.
flask/bin/pip uninstall pymongo
flask/bin/pip install pymongo==2.8
Me encontré con esto también.
Esto podría deberse a que pymongo3 no es seguro para las horquillas .
--lazy-apps
esto agregando --lazy-apps
param a uwsgi, esto puede evitar el problema de "bifurcación segura".
viendo uwsgi doc preforking-vs-lazy-apps-vs-lazy .
Aviso, no estoy seguro de que estos dos tengan conexión positiva.
No estoy seguro de si está utilizando el MongoDB emparejado con el servicio AWS Cloud. Pero si es así, descubrí que tiene que especificar a qué dirección IP desea que MongoDB tenga acceso.
Entonces, lo que debe hacer es agregar la dirección IP de su servidor host para permitir la entrada.
En MongoAtlas, esto se puede hacer en esta página.
Sé que ya existía una solución para el mismo problema, pero no encontré una solución que ayudara a mi situación, así que quería publicar esto, para que otros pudieran beneficiarse si alguna vez se enfrentan al mismo problema que yo.
Si puede ayudar, lo soluciono por reemplazar:
from flask.ext.mongoengine import MongoEngine
por:
from flask_mongoengine import MongoEngine
Tuve el mismo problema con Pymongo 3.5 Resulta que reemplazar localhost con 127.0.0.1 o la dirección IP correspondiente de su instancia mongodb resuelve el problema.
quizás pueda intentar agregar la dirección IP de su servidor en el archivo mongod.conf. Si usas linux (ubuntu) os, puedes probar mi solución:
modificar el archivo mongod.conf:
vi /etc/mongod.conf
y puede agregar la dirección IP del servidor mongodb detrás de 127.0.0.1, y guardar:
net: port:27017 bindIp:127.0.0.1,mongodb server ip
en el teminal
sudo service mongod restart
Ahora, puedes intentar conectar mongodb usando pymongo MongoClient.
Primero configura el entorno MongoDB.
Ejecute esto en CMD - "C: / Archivos de programa / MongoDB / Server / 3.6 / bin / mongod.exe"
- Abra otro CMD y ejecute esto: "C: / Archivos de programa / MongoDB / Server / 3.6 / bin / mongo.exe"
Y luego puedes usar pymongo [aviso anaconda]
import pymongo
from pymongo import MongoClient
client = MongoClient()
db = client.test_db
collection = db[''test_coll'']
Consulte: https://docs.mongodb.com/tutorials/install-mongodb-on-windows/