MongoKit与MongoEngine和Flask-MongoAlchemy for Flask
任何人都有使用MongoKit,MongoEngine或Flask-MongoAlchemy for Flask的经验吗?MongoKit与MongoEngine和Flask-MongoAlchemy for Flask
你更喜欢哪一个?积极或消极的经历? Flask-Newbie的选项过多。
我花了很多时间评估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
标题。
当然,您的输入需要进行消毒,并且所提供的代码将不起作用(我的意思是作为示例,但不难理解我的观点)。
同样,我尝试了一切,但是这种架构使我的代码变得灵活,简单和可扩展。
+1。 Mongo上不需要ORM。直接使用Pymongo会给你完全的自由。 – sojin 2012-02-26 07:29:43
优秀的答案! – RubyGladiator 2012-06-27 05:59:37
我喜欢这个答案,但只是想指出,它在大多数情况下并不像仅仅直接返回mongo集合那么简单,仅仅是因为mongo中的最佳做法是缩短字段名称......尤其是像用户集合中的某些东西(如果网站是高流量)或分析数据等。基本上,我的问题是,如果在您的休息应用程序中缩短字段名称,您将如何进行转换? (即,u - >用户名,e - >电子邮件等,以节省磁盘和内存消耗) – Jordan 2012-12-05 06:39:06
似乎有点苛刻关闭此用户的问题!我发现它很有帮助。 – RubyGladiator 2012-06-27 05:56:57
同上,我发现它也有帮助。 – Tim 2012-10-22 20:18:23
优秀的答案,我发现它很有帮助,我敢打赌别人有好主意 - 重新打开? – 2015-10-23 10:48:23