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.