任何人都有使用MongoKit,MongoEngine或Flask-MongoAlchemy for Flask的经验吗?
你更倾向哪个?积极或消极的经历?Flask-Newbie的选择太多。
任何人都有使用MongoKit,MongoEngine或Flask-MongoAlchemy for Flask的经验吗?
你更倾向哪个?积极或消极的经历?Flask-Newbie的选择太多。
Answers:
我花了很多时间评估MongoDB的流行Python ORM。这是一项详尽的练习,因为我真的很想选一个。
我的结论是,ORM消除了MongoDB带来的乐趣。没有人感到自然,他们施加的限制类似于使我首先脱离关系数据库的限制。
再说一次,我真的很想使用ORM,但是现在我确信pymongo直接使用是可行的方法。现在,我遵循一个包含MongoDB,pymongoPython和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标题。
当然,您需要清理您的输入,并且所提供的代码将无法正常工作(我的意思是作为示例,但这并不难理解我的观点)。
我再次尝试了所有方法,但是这种体系结构使我的代码变得灵活,简单和可扩展。