MongoKit与MongoEngine和Flask-MongoAlchemy for Flask

问题描述:

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

你更喜欢哪一个?积极或消极的经历? Flask-Newbie的选项过多。

+37

似乎有点苛刻关闭此用户的问题!我发现它很有帮助。 – RubyGladiator 2012-06-27 05:56:57

+1

同上,我发现它也有帮助。 – Tim 2012-10-22 20:18:23

+0

优秀的答案,我发现它很有帮助,我敢打赌别人有好主意 - 重新打开? – 2015-10-23 10:48:23

我花了很多时间评估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在可能的情况(顺便说一下,我觉得Flask增加了一个不必要的复杂因素Werkzeug)。

功能representation取请求的Accept标头,并产生合适的表示(例如,application/json,或text/html)。这并不难实现。它还添加了Last-Modified标题。

当然,您的输入需要进行消毒,并且所提供的代码将不起作用(我的意思是作为示例,但不难理解我的观点)。

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

+9

+1。 Mongo上不需要ORM。直接使用Pymongo会给你完全的*。 – sojin 2012-02-26 07:29:43

+0

优秀的答案! – RubyGladiator 2012-06-27 05:59:37

+0

我喜欢这个答案,但只是想指出,它在大多数情况下并不像仅仅直接返回mongo集合那么简单,仅仅是因为mongo中的最佳做法是缩短字段名称......尤其是像用户集合中的某些东西(如果网站是高流量)或分析数据等。基本上,我的问题是,如果在您的休息应用程序中缩短字段名称,您将如何进行转换? (即,u - >用户名,e - >电子邮件等,以节省磁盘和内存消耗) – Jordan 2012-12-05 06:39:06