MongoKit VS MongoEngine VS Flask-MongoAlchemy for Flask

有人用过 MongoKit,MongoEngine 或者 Flask-MongoAlchemy for Flask 吗?

你更喜欢哪一个? 积极的还是消极的经历? 对于一个酒瓶新手来说有太多的选择。

20805 次浏览

我已经投入了大量的时间来评估 MongoDB 的流行 Python ORMs。这是一个详尽的练习,因为我真的很想选一个。

我的结论是,ORM 消除了 MongoDB 的乐趣。没有一种感觉是自然的,它们施加的限制类似于最初使我远离关系数据库的那些限制。

同样,我真的很想使用 ORM,但是现在我确信直接使用 pymongo是可行的方法。现在,我遵循一个包含 MongoDB、 pymongo和 Python 的模式。

面向资源的体系结构导致非常自然的表示:

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)

Resource基类看起来像

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)

注意,我直接使用了 WSGI规范,并尽可能地利用了 Werkzeug(顺便说一句,我认为 FlaskWerkzeug增加了不必要的复杂性)。

函数 representation接受请求的 Accept头,并生成适当的表示(例如,application/jsontext/html)。执行起来并不困难。它还添加了 Last-Modified头。

当然,您的输入需要经过过滤,并且所提供的代码将不能正常工作(我的意思是作为一个示例,但是理解我的观点并不困难)。

同样,我尝试了所有的方法,但是这种架构使我的代码变得灵活、简单和可扩展。