with example create python mongodb uwsgi mlab pymongo-3.x

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



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:

  1. 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

  2. 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/