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
(顺便说一下,我认为Flask
为Werkzeug
添加了不必要的复杂性)。
函数representation
采用请求的Accept
头,并产生一个合适的表示(例如application/json
或text/html
)。 这并不难实现。 它还添加了Last-Modified
标题。
当然,你的input需要被消毒,所提供的代码将不起作用(我的意思是作为一个例子,但不难理解我的观点)。
再次,我尝试了一切,但是这个架构使我的代码变得灵活,简单和可扩展。