MongoKit vs MongoEngine vs Flask-MongoAlchemy for Flask



有人有使用MongoKit、MongoEngine或Flask MongoAlchemy for Flask的经验吗?

你更喜欢哪一个?积极的还是消极的经历?。Flask新手的选择太多了。

我投入了大量时间来评估流行的MongoDB 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报头。

当然,您的输入需要净化,并且所呈现的代码将不起作用(我的意思是举个例子,但不难理解我的观点)。

我再次尝试了所有的方法,但这种体系结构使我的代码变得灵活、简单和可扩展。

最新更新