example create _id python mongodb sqlalchemy flask

python - create - MongoKit vs MongoEngine vs Flask-MongoAlchemy para Frasco



pymongo_id (1)

He invertido mucho tiempo evaluando los populares ORM de Python para MongoDB. Este fue un ejercicio exhaustivo, ya que realmente quería elegir uno.

Mi conclusión es que un ORM elimina la diversión de MongoDB. Ninguno se siente natural, imponen restricciones similares a las que me hicieron alejarme de las bases de datos relacionales en primer lugar.

De nuevo, realmente quería usar un ORM, pero ahora estoy convencido de que usar pymongo directamente es el camino a seguir. Ahora, sigo un patrón que abarca MongoDB, pymongo y Python.

Una arquitectura orientada a los recursos conduce a representaciones muy naturales. Por ejemplo, tome el siguiente recurso de usuario:

from werkzeug.wrappers import Response from werkzeug.exceptions import NotFound Users = pymongo.Connection("localhost", 27017)["mydb"]["users"] class User(Resource): def GET(self, request, username): spec = { "_id": username, "_meta.active": True } # this is a simple call to pymongo - really, do # we need anything else? doc = Users.find_one(spec) if not doc: return NotFound(username) payload, mimetype = representation(doc, request.accept) return Response(payload, mimetype=mimetype, status=200) def PUT(self, request, username): spec = { "_id": username, "_meta.active": True } operation = { "$set": request.json, } # this call to pymongo will return the updated document (implies safe=True) doc = Users.update(spec, operation, new=True) if not doc: return NotFound(username) payload, mimetype = representation(doc, request.accept) return Response(payload, mimetype=mimetype, status=200)

La clase base de Resource ve como

class Resource(object): def GET(self, request, **kwargs): return NotImplemented() def HEAD(self, request, **kwargs): return NotImplemented() def POST(self, request, **kwargs): return NotImplemented() def DELETE(self, request, **kwargs): return NotImplemented() def PUT(self, request, **kwargs): return NotImplemented() def __call__(self, request, **kwargs): handler = getattr(self, request.method) return handler(request, **kwargs)

Tenga en cuenta que utilizo la especificación de WSGI directamente, y aprovecho Werkzeug siempre que sea posible (por cierto, creo que Flask agrega una complicación innecesaria a Werkzeug ).

La representation función toma los encabezados Accept la solicitud y produce una representación adecuada (por ejemplo, application/json o text/html ). No es difícil de implementar. También agrega el encabezado Last-Modified .

Por supuesto, su información debe ser desinfectada, y el código, tal como se presenta, no funcionará (lo digo como un ejemplo, pero no es difícil entender mi punto).

De nuevo, probé todo, pero esta arquitectura hizo que mi código fuera flexible, simple y extensible.

¿Alguien tiene experiencias con MongoKit, MongoEngine o Flask-MongoAlchemy for Flask?

¿Cuál prefieres? ¿Experiencias positivas o negativas ?. Demasiadas opciones para un Flask-Newbie.