Hat jemand Erfahrungen mit MongoKit, MongoEngine oder Flask-MongoAlchemy for Flask?
Welches bevorzugen Sie? Positive oder negative Erfahrungen?. Zu viele Optionen für einen Flask-Newbie.
python
mongodb
sqlalchemy
flask
Oscarmlage
quelle
quelle
Antworten:
Ich habe viel Zeit investiert, um die beliebten Python-ORMs für MongoDB zu evaluieren. Dies war eine erschöpfende Übung, da ich wirklich eine auswählen wollte.
Mein Fazit ist, dass ein ORM den Spaß aus MongoDB entfernt. Keiner fühlt sich natürlich an, sie legen ähnliche Einschränkungen fest wie diejenigen, die mich dazu gebracht haben, mich von relationalen Datenbanken zu entfernen.
Auch hier wollte ich unbedingt ein ORM verwenden, aber jetzt bin ich davon überzeugt, dass die
pymongo
direkte Verwendung der richtige Weg ist. Jetzt folge ich einem Muster, das MongoDBpymongo
und Python umfasst.Eine ressourcenorientierte Architektur führt zu sehr natürlichen Darstellungen. Nehmen Sie zum Beispiel die folgende Benutzerressource:
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)
Die
Resource
Basisklasse sieht aus wieclass 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)
Beachten Sie, dass ich die
WSGI
Spezifikation direkt verwende undWerkzeug
wenn möglich nutze (übrigens denke ich, dass diesFlask
eine unnötige Komplikation darstelltWerkzeug
).Die Funktion verwendet
representation
dieAccept
Header der Anforderung und erstellt eine geeignete Darstellung (z. B.application/json
odertext/html
). Es ist nicht schwer zu implementieren. Außerdem wird derLast-Modified
Header hinzugefügt.Natürlich muss Ihre Eingabe bereinigt werden, und der dargestellte Code funktioniert nicht (ich meine es als Beispiel, aber es ist nicht schwer, meinen Standpunkt zu verstehen).
Wieder habe ich alles versucht, aber diese Architektur hat meinen Code flexibel, einfach und erweiterbar gemacht.
quelle