MongoKit与MongoEngine和Flask-MongoAlchemy for Flask

任何人都有MongoKit,MongoEngine或Flask-MongoAlchemy for Flask的经验吗?

你更倾向哪个? 积极或消极的经历? 太多的选项为烧瓶新手。

我花了很多时间评估MongoDB的stream行Python ORM。 这是一个详尽的练习,因为我真的想挑一个。

我的结论是,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标题。

当然,你的input需要被消毒,所提供的代码将不起作用(我的意思是作为一个例子,但不难理解我的观点)。

再次,我尝试了一切,但是这个架构使我的代码变得灵活,简单和可扩展。