首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >MongoKit vs MongoEngine vs Flask -用于Flask的MongoAlchemy

MongoKit vs MongoEngine vs Flask -用于Flask的MongoAlchemy
EN

Stack Overflow用户
提问于 2012-02-26 04:09:37
回答 1查看 20.2K关注 0票数 78

谁有使用MongoKit,MongoEngine或Flask-MongoAlchemy的经验?

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-02-26 04:27:59

我花了很多时间评估用于MongoDB的流行的Python ORMs。这是一个详尽的练习,因为我真的很想选择一个。

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

同样,我真的很想使用对象关系映射,但现在我确信直接使用pymongo是可行的。现在,我将遵循一个包含MongoDB、pymongo和Python的模式。

面向资源的体系结构导致了非常自然的表示。以下面的用户资源为例:

代码语言:javascript
复制
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基类如下所示

代码语言:javascript
复制
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标头。

当然,您的输入需要进行清理,并且所提供的代码将无法工作(我的意思是举个例子,但这并不难理解我的观点)。

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

票数 91
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9447629

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档